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

我是一名 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?实例化 a 的唯一方法DynamoDB是使用方法:


func New(...) *dynamodb.DynamoDB

在dynamodb包中。我可以以某种方式使用它来构建 a 的实例dynamoDBLogger吗?不确定它是否会起作用,但我希望该*dynamoDbLogger类型可用作*dynamodb.DynamoDB.


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


func GetDynamoClient(sess *session.Session) *dynamodb.DynamoDB {

    svc := dynamoDBLogger{}

    svc.DynamoDB = *dynamodb.New(sess)

    return &svc

}

即类型系统不允许用 a*dynamodb.DynamoDB替换 a *dynamoDBLogger。我想知道 Go 的类型系统是否允许我想要完成的事情,因为dynamodb.DynamoDB不是接口?


30秒到达战场
浏览 87回答 1
1回答

红糖糍粑

最好使用 dynamo db 接口。它提供了为测试创建模拟的可能性。例子:package mainimport (    "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 teststype mockDB struct {    dynamodbiface.DynamoDBAPI}func NewMockDB() dynamodbiface.DynamoDBAPI {}在模拟中,您需要实现程序中实际使用的唯一方法。完整示例在:https ://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/dynamodbiface/
打开App,查看更多内容
随时随地看视频慕课网APP