使用SAM CLI开发Lambda的Go代码遇构建失败与导入异常
问题解决步骤
1. 修正包名拼写错误
你执行go get时的包名拼写有误,把featrues改成feature——正确的包路径是github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue。
2. 正确导入并使用类型包
你的代码错误地将attributevalue当成了dynamodb服务包下的类型,实际上DynamoDB的基础类型(包括AttributeValue)在service/dynamodb/types包中。另外Go语言会自动移除未被代码使用的导入,所以必须在代码中正确引用包内类型,导入语句才会保留。
修改后的完整代码:
package main import ( "context" "log" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/dynamodb" "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" ) func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-east-1")) if err != nil { log.Fatalf("unable to load SDK config, %v", err) } svc := dynamodb.NewFromConfig(cfg) resp, err := svc.UpdateItem(context.TODO(), &dynamodb.UpdateItemInput{ TableName: aws.String("table-name"), Key: map[string]types.AttributeValue{ "ID": &types.AttributeValueMemberS{Value: "visitors"}, }, UpdateExpression: aws.String("ADD visitors :inc"), ExpressionAttributeValues: map[string]types.AttributeValue{ ":inc": &types.AttributeValueMemberN{Value: "1"}, }, }) if err != nil { log.Fatalf("Got error calling UpdateItem: %s", err) } return events.APIGatewayProxyResponse{ Headers: map[string]string{ "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "*", "Access-Control-Allow-Headers": "*", }, StatusCode: 200, }, nil } func main() { lambda.Start(handler) }
3. 正确安装依赖
执行以下命令安装所需的AWS SDK v2包:
go get github.com/aws/aws-sdk-go-v2/service/dynamodb go get github.com/aws/aws-sdk-go-v2/service/dynamodb/types
然后执行命令整理依赖并生成vendor目录:
go mod tidy go mod vendor
关键说明
- 你之前混淆了
feature/dynamodb(提供高级操作封装)和service/dynamodb/types(定义DynamoDB基础类型)两个包,更新请求参数需要使用types包下的具体类型(如AttributeValueMemberS、AttributeValueMemberN)。 - Go的模块工具会自动清理未被代码引用的导入,只要代码中正确使用了导入包的类型,导入语句就不会被自动删除。
内容的提问来源于stack exchange,提问作者echough1
相关产品推荐
相关产品推荐

