为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
30秒到达战场 2022-10-24 16:30:06
我是一名 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不是接口?
查看完整描述

1 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

最好使用 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/


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信