我是一名 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不是介面?
uj5u.com熱心網友回復:
最好使用 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/
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/414525.html
標籤:
