DynamoDB GetItem en Go (AWS SDK v2)

En AWS SDK for Go v2 un Item es un map[string]types.AttributeValue, y types.AttributeValue es una interfaz sellada: las únicas implementaciones son las diez structs AttributeValueMember* que trae el SDK. Escribir una clave con ellas es fácil. Leer los valores de vuelta es donde Go se separa de todos los demás SDK.

client.GetItem sigue queriendo la clave principal completa, igual que en todas partes.

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

Explicación

  • Los escalares son punterosTableName, ProjectionExpression y ConsistentRead son *string y *bool para que el SDK distinga «sin establecer» del valor cero. aws.String, aws.Bool y aws.Int32 existen para eso y para nada más.
  • Los números llegan como cadenasAttributeValueMemberN.Value es un string, porque DynamoDB envía los números como cadenas por el cable. Leer Year significa out.Item["Year"].(*types.AttributeValueMemberN) y luego strconv.Atoi. Usa la forma coma-ok de la aserción; la forma escueta entra en pánico cuando el atributo falta o es de otro tipo.
  • attributevalue.UnmarshalMap es la salida — de github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue, mapea el Item entero sobre una struct con etiquetas dynamodbav y hace la conversión de cadena a número. Vale la pena recurrir a ella en cuanto un Item tiene más de un par de atributos.
  • out.Item es nil cuando no hay coincidencia, y err también es nil. len(out.Item) == 0 cubre tanto nil como vacío si no necesitas distinguirlos.
  • Compara los errores con errors.As — Go v2 envuelve los fallos del servicio en un error de operación de Smithy, así que tanto err == … como comparar cadenas sobre err.Error() fallan en silencio. Declara var nf *types.ResourceNotFoundException y pasa su dirección.
  • ConsistentRead: aws.Bool(true) duplica el coste de lectura y se rechaza en un GSI. Los alias #proj de arriba tampoco son decoración: Year es una palabra reservada, y una proyección que la nombre directamente se rechaza.

Hazlo visualmente

Traducir entre la forma AttributeValueMember* y JSON plano es un impuesto constante en Go. El conversor de DynamoDB JSON hace esa ida y vuelta en el navegador cuando solo necesitas leer o pegar un Item.

DynoTable muestra los Items como filas normales, y exporta la consulta que hay detrás de la cuadrícula como un programa de Go construido sobre estos mismos tipos del SDK v2. Descarga DynoTable.

Ejemplos relacionados

Referencias

Verificado por última vez el 2026-07-28 contra la documentación oficial de AWS enlazada arriba.

Trabaja con DynamoDB sin la Consola

Un cliente de escritorio rápido para DynamoDB que ejecuta el SQL real que DynamoDB no puede — JOINs, GROUP BY, agregaciones — con edición visual y un agente de IA con tus propias claves de Bedrock.

Prueba gratuita de 30 días, sin tarjeta — después, el plan Free sin límite de tiempo.