Exemplo de GetItem do DynamoDB em Go (AWS SDK v2)
No AWS SDK for Go v2 um item é um map[string]types.AttributeValue, e types.AttributeValue é uma interface selada: as únicas implementações são as dez structs AttributeValueMember* que o SDK traz. Escrever uma chave com elas é fácil. Ler os valores de volta é onde o Go diverge de todos os outros SDKs.
client.GetItem continua querendo a chave primária completa, como em todo lugar.
Código
package main
import (
"context"
"fmt"
"log"
"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 main() {
ctx := context.TODO()
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("us-east-1"))
if err != nil {
log.Fatalf("load config: %v", err)
}
client := dynamodb.NewFromConfig(cfg)
out, err := client.GetItem(ctx, &dynamodb.GetItemInput{
TableName: aws.String("Music"),
Key: map[string]types.AttributeValue{
"Artist": &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
"SongTitle": &types.AttributeValueMemberS{Value: "Cubano Chant"},
},
ProjectionExpression: aws.String("#proj0, #proj1, #proj2, #proj3"),
ExpressionAttributeNames: map[string]string{
"#proj0": "Artist",
"#proj1": "SongTitle",
"#proj2": "AlbumTitle",
"#proj3": "Year",
},
})
if err != nil {
log.Fatalf("get item: %v", err)
}
if out.Item == nil {
fmt.Println("Item not found")
return
}
fmt.Println(out.Item)
}Explicação
- Escalares são ponteiros —
TableName,ProjectionExpressioneConsistentReadsão*stringe*boolpara que o SDK consiga distinguir "não definido" do valor zero.aws.String,aws.Booleaws.Int32existem para isso e para nada mais. - Números chegam como strings —
AttributeValueMemberN.Valueé umastring, porque o DynamoDB envia números como strings no transporte. LerYearsignificaout.Item["Year"].(*types.AttributeValueMemberN)e depoisstrconv.Atoi. Use a forma comma-ok da asserção; a forma nua entra em pânico quando o atributo está ausente ou é de outro tipo. attributevalue.UnmarshalMapé a saída — degithub.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue, ele mapeia o item inteiro para uma struct com tagsdynamodbave faz a conversão de string para número. Vale recorrer a ele assim que um item tiver mais que uns poucos atributos.out.Iteménilquando não há resultado, eerrtambém énil.len(out.Item) == 0cobre tanto nil quanto vazio se você não precisar distinguir os dois.- Case erros com
errors.As— o Go v2 embrulha as falhas do serviço em um erro de operação do Smithy, então tantoerr == …quanto comparação de string emerr.Error()falham silenciosamente. Declarevar nf *types.ResourceNotFoundExceptione passe o endereço dele. ConsistentRead: aws.Bool(true)dobra o custo de leitura e é rejeitado em um GSI. Os aliases#projacima também não são decoração:Yearé uma palavra reservada, e uma projeção que a nomeie diretamente é recusada.
Faça isso visualmente
Traduzir entre a forma AttributeValueMember* e JSON puro é um imposto constante em Go. O conversor de DynamoDB JSON faz essa ida e volta no navegador quando você só precisa ler ou colar um item.
O DynoTable mostra os itens como linhas comuns e exporta a consulta por trás da grade como um programa Go construído sobre esses mesmos tipos do SDK v2. Baixe o DynoTable.
Exemplos relacionados
- DynamoDB GetItem em Java — a mesma leitura com o AWS SDK for Java 2.x.
- DynamoDB Query em Go — leia uma partição inteira em vez de um item.
- Como funcionam as chaves de partição do DynamoDB — por que o
GetItemprecisa da chave completa. - DynamoDB ResourceNotFoundException — o primeiro erro de sempre aqui: nome de tabela ou região errados.
- "The provided key element does not match the schema" — a chave que você passa não corresponde ao schema de chave da tabela.
Referências
- GetItem — Amazon DynamoDB API Reference
- Use GetItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- dynamodb package — AWS SDK for Go v2 (pkg.go.dev)
- dynamodb/types package — AWS SDK for Go v2 (pkg.go.dev)
- attributevalue package — AWS SDK for Go v2 (pkg.go.dev)
- Read consistency — Amazon DynamoDB Developer Guide
Verificado pela última vez em 2026-07-28 contra a documentação oficial da AWS vinculada acima.