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 ponteirosTableName, ProjectionExpression e ConsistentRead são *string e *bool para que o SDK consiga distinguir "não definido" do valor zero. aws.String, aws.Bool e aws.Int32 existem para isso e para nada mais.
  • Números chegam como stringsAttributeValueMemberN.Value é uma string, porque o DynamoDB envia números como strings no transporte. Ler Year significa out.Item["Year"].(*types.AttributeValueMemberN) e depois strconv.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 — de github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue, ele mapeia o item inteiro para uma struct com tags dynamodbav e 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 é nil quando não há resultado, e err também é nil. len(out.Item) == 0 cobre 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 tanto err == … quanto comparação de string em err.Error() falham silenciosamente. Declare var nf *types.ResourceNotFoundException e passe o endereço dele.
  • ConsistentRead: aws.Bool(true) dobra o custo de leitura e é rejeitado em um GSI. Os aliases #proj acima 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

Referências

Verificado pela última vez em 2026-07-28 contra a documentação oficial da AWS vinculada acima.

Trabalhe com o DynamoDB sem o Console

Um cliente desktop rápido para DynamoDB que roda o SQL de verdade que o DynamoDB não consegue — JOINs, GROUP BY, agregações — com edição visual e um agente de IA com suas próprias chaves do Bedrock.

Teste grátis de 30 dias, sem cartão de crédito — depois o plano Grátis sem limite de tempo.