登录
首页 >  Golang >  Go问答

使用嵌入结构的构造函数实例化结构

来源:stackoverflow

时间:2024-04-07 20:27:34 354浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《使用嵌入结构的构造函数实例化结构》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我是一名 go 新手,试图覆盖适用于 dynamodb 的 aws go 开发工具包中的某些方法。基本上,我想向 dynamodb 客户端中的某些方法添加一些日志记录。我的代码是:

type dynamodblogger struct {
  dynamodb.dynamodb
}

func (d *dynamodblogger) deleteitemwithcontext(ctx context.context, item *dynamodb.deleteiteminput) (*dynamodb.deleteitemoutput, error) {
    logger.debug("deleting from dynamodb: %+v", *item)
    return d.dynamodb.deleteitemwithcontext(ctx, item)
}

换句话说,它只是在实际调用之前添加一条日志记录语句。这段代码可以编译。现在的问题是如何创建 dynamodblogger?实例化 dynamodb 的唯一方法是使用以下方法:

func new(...) *dynamodb.dynamodb

dynamodb 包中。我可以以某种方式使用它来构建 dynamodblogger 的实例吗?不确定它是否有效,但我希望 *dynamodblogger 类型可以用作 *dynamodb.dynamodb

编辑:我实际上注意到以下失败:

func GetDynamoClient(sess *session.Session) *dynamodb.DynamoDB {
    svc := dynamoDBLogger{}
    svc.DynamoDB = *dynamodb.New(sess)
    return &svc
}

即类型系统不允许用 *dynamodblogger 替换 *dynamodb.dynamodb。我想知道 go 的类型系统是否允许我尝试完成的任务,因为 dynamodb.dynamodb 不是一个接口?


正确答案


最好使用dynamo db接口。它提供了为测试创建模拟的可能性。示例:

package main

import (
    "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbiface"
)

type dynamoDBLogger struct {
    DynamoDBAPI
}

func NewDynamoDB() dynamodbiface.DynamoDBAPI {
    svc := &dynamoDBLogger{
        DynamoDBAPI: dynamodb.New(sess),
    }
    return &svc
}

// in tests

type mockDB struct {
    dynamodbiface.DynamoDBAPI
}

func NewMockDB() dynamodbiface.DynamoDBAPI {
}

在模拟中,您需要实现程序中实际使用的唯一方法。

完整示例位于:https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/dynamodbiface/

今天关于《使用嵌入结构的构造函数实例化结构》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>