DynamoDB GetItem di Go (AWS SDK v2)

Di AWS SDK for Go v2 sebuah item adalah map[string]types.AttributeValue, dan types.AttributeValue adalah interface tertutup: satu-satunya implementasi adalah sepuluh struct AttributeValueMember* yang dikirimkan SDK. Menulis sebuah key dengan struct itu gampang. Membaca nilainya kembali adalah tempat Go menyimpang dari semua SDK lain.

client.GetItem tetap menuntut primary key lengkap, sama seperti di mana pun.

Kode

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

Penjelasan

  • Skalar berupa pointerTableName, ProjectionExpression dan ConsistentRead bertipe *string dan *bool supaya SDK bisa membedakan "tidak diset" dari nilai nol. aws.String, aws.Bool dan aws.Int32 ada untuk itu dan tidak untuk hal lain.
  • Angka tiba sebagai stringAttributeValueMemberN.Value bertipe string, karena DynamoDB mengirim angka sebagai string di jalur wire. Membaca Year berarti out.Item["Year"].(*types.AttributeValueMemberN) lalu strconv.Atoi. Pakai bentuk comma-ok dari type assertion; bentuk telanjangnya panik ketika atributnya hilang atau bertipe lain.
  • attributevalue.UnmarshalMap adalah jalan keluarnya — dari github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue, ia memetakan seluruh item ke sebuah struct dengan tag dynamodbav dan melakukan konversi string-ke-angka. Layak dipakai begitu sebuah item punya lebih dari beberapa atribut.
  • out.Item bernilai nil saat tidak ketemu, dan err juga nil. len(out.Item) == 0 mencakup nil maupun kosong kalau Anda tidak perlu membedakan keduanya.
  • Cocokkan error dengan errors.As — Go v2 membungkus kegagalan layanan dalam sebuah Smithy operation error, jadi err == … dan pencocokan string pada err.Error() sama-sama gagal diam-diam. Deklarasikan var nf *types.ResourceNotFoundException lalu berikan alamatnya.
  • ConsistentRead: aws.Bool(true) melipatgandakan biaya baca dan ditolak pada sebuah GSI. Alias #proj di atas juga bukan hiasan: Year adalah reserved word, dan projection yang menyebutnya secara langsung akan ditolak.

Lakukan secara visual

Menerjemahkan bolak-balik antara bentuk AttributeValueMember* dan JSON biasa adalah pajak yang terus-menerus di Go. Konverter DynamoDB JSON melakukan perjalanan bolak-balik itu di browser ketika Anda hanya perlu membaca atau menempelkan satu item.

DynoTable justru menampilkan item sebagai baris biasa, dan mengekspor kueri di balik grid itu sebagai program Go yang dibangun di atas tipe SDK v2 yang sama. Unduh DynoTable.

Contoh terkait

Referensi

Terakhir diverifikasi 2026-07-28 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.