GetItem DynamoDB in Go (AWS SDK v2)

In AWS SDK for Go v2 un item è una map[string]types.AttributeValue, e types.AttributeValue è un'interfaccia sigillata: le uniche implementazioni sono le dieci struct AttributeValueMember* che l'SDK fornisce. Scrivere una chiave con esse è facile. Rileggere i valori è il punto in cui Go diverge da ogni altro SDK.

client.GetItem vuole comunque la chiave primaria completa, come ovunque.

Codice

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)
}

Spiegazione

  • Gli scalari sono puntatoriTableName, ProjectionExpression e ConsistentRead sono *string e *bool così l'SDK può distinguere "non impostato" dal valore zero. aws.String, aws.Bool e aws.Int32 esistono per questo e per nient'altro.
  • I numeri arrivano come stringheAttributeValueMemberN.Value è una string, perché DynamoDB invia i numeri come stringhe sul filo. Leggere Year significa out.Item["Year"].(*types.AttributeValueMemberN) e poi strconv.Atoi. Usa la forma comma-ok dell'asserzione; la forma nuda va in panic quando l'attributo manca o è di un altro tipo.
  • attributevalue.UnmarshalMap è la via d'uscita — da github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue, mappa l'intero item su una struct con i tag dynamodbav e fa la conversione stringa-numero. Vale la pena ricorrervi nel momento in cui un item ha più di un paio di attributi.
  • out.Item è nil quando non c'è nulla, e anche err è nil. len(out.Item) == 0 copre sia nil che vuoto se non hai bisogno di distinguerli.
  • Confronta gli errori con errors.As — Go v2 avvolge i fault del servizio in un operation error Smithy, quindi sia err == … sia il confronto di stringhe su err.Error() falliscono silenziosamente. Dichiara var nf *types.ResourceNotFoundException e passa il suo indirizzo.
  • ConsistentRead: aws.Bool(true) raddoppia il costo di lettura ed è rifiutato su un GSI. Nemmeno gli alias #proj qui sopra sono decorazione: Year è una parola riservata, e una proiezione che la nomina direttamente viene rifiutata.

Fallo visivamente

Tradurre tra la forma AttributeValueMember* e il JSON normale è una tassa costante in Go. Il convertitore DynamoDB JSON fa quel viaggio di andata e ritorno nel browser quando devi solo leggere o incollare un item.

DynoTable mostra invece gli item come normali righe, ed esporta la query dietro la griglia come un programma Go costruito su questi stessi tipi dell'SDK v2. Scarica DynoTable.

Esempi correlati

Riferimenti

Ultima verifica 2026-07-28 rispetto alla documentazione ufficiale AWS collegata sopra.

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.