我是一名 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/
- 1 回答
- 0 关注
- 101 浏览
添加回答
举报
0/150
提交
取消