DynamoDB GetItem in Go (AWS SDK v2)

Im AWS SDK for Go v2 ist ein Item eine map[string]types.AttributeValue, und types.AttributeValue ist ein versiegeltes Interface: Die einzigen Implementierungen sind die zehn AttributeValueMember*-Structs, die das SDK mitbringt. Damit einen Key zu schreiben ist einfach. Werte wieder herauszulesen ist die Stelle, an der Go von jedem anderen SDK abweicht.

client.GetItem will nach wie vor den vollständigen Primärschlüssel, genau wie überall sonst.

Code

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

Erklärung

  • Skalare sind PointerTableName, ProjectionExpression und ConsistentRead sind *string bzw. *bool, damit das SDK „nicht gesetzt" vom Nullwert unterscheiden kann. aws.String, aws.Bool und aws.Int32 existieren genau dafür und für sonst nichts.
  • Zahlen kommen als Strings anAttributeValueMemberN.Value ist ein string, weil DynamoDB Zahlen auf der Leitung als Strings sendet. Year zu lesen heißt out.Item["Year"].(*types.AttributeValueMemberN) und danach strconv.Atoi. Nutze die Comma-ok-Form der Type Assertion; die nackte Form löst eine Panic aus, wenn das Attribut fehlt oder einen anderen Typ hat.
  • attributevalue.UnmarshalMap ist der Ausweg — aus github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue; es mappt das gesamte Item auf ein Struct mit dynamodbav-Tags und erledigt die String-zu-Zahl-Umwandlung. Lohnt sich, sobald ein Item mehr als eine Handvoll Attribute hat.
  • out.Item ist nil, wenn nichts gefunden wird, und err ist es ebenfalls. len(out.Item) == 0 deckt nil und leer zugleich ab, wenn du beides nicht unterscheiden musst.
  • Fehler mit errors.As abgleichen — Go v2 verpackt Service-Fehler in einen Smithy-Operation-Error, sodass sowohl err == … als auch String-Matching auf err.Error() stillschweigend fehlschlagen. Deklariere var nf *types.ResourceNotFoundException und übergib dessen Adresse.
  • ConsistentRead: aws.Bool(true) verdoppelt die Lesekosten und wird auf einem GSI abgelehnt. Die #proj-Aliase oben sind ebenfalls keine Deko: Year ist ein reserviertes Wort, und eine Projection, die es direkt benennt, wird zurückgewiesen.

Mach es visuell

Zwischen der AttributeValueMember*-Form und schlichtem JSON hin- und herzuübersetzen ist in Go eine ständige Steuer. Der DynamoDB-JSON-Konverter macht diesen Hin- und Rückweg im Browser, wenn du nur ein Item lesen oder einfügen willst.

DynoTable zeigt Items stattdessen als ganz normale Zeilen und exportiert die Abfrage hinter dem Grid als Go-Programm, das auf denselben SDK-v2-Typen aufbaut. DynoTable herunterladen.

Verwandte Beispiele

Referenzen

Zuletzt verifiziert am 2026-07-28 gegen die oben verlinkte offizielle AWS-Dokumentation.

Mit DynamoDB ohne die Console arbeiten

Ein schneller DynamoDB-Desktop-Client, der das echte SQL ausführt, das DynamoDB nicht kann — JOINs, GROUP BY, Aggregationen — mit visueller Bearbeitung und einem KI-Agenten auf deinen eigenen Bedrock-Schlüsseln.

30 Tage kostenlos testen, keine Kreditkarte — danach der Kostenlos-Tarif ohne Zeitlimit.