繁体   English   中英

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

[英]Instantiating struct using constructor of embedded struct

我是 Go 新手,试图覆盖 DynamoDB 的 AWS Go SDK 中的一些方法。 基本上,我想在 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 package 中。 我可以以某种方式使用它来构建dynamoDBLogger的实例吗? 不确定它是否会起作用,但我希望*dynamoDbLogger类型可用作*dynamodb.DynamoDB

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

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

即类型系统不允许将*dynamodb.DynamoDB替换为*dynamoDBLogger 我想知道 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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM