配列

package main

import (
	"fmt"
)

func main() {
	// 配列: 最初に宣言した要素数から変更はできない
	aDocs := [3]string{"shiba", "bulldog", "toy poodle"}
	fmt.Println(aDocs[0]) // 出力: shiba

	// for文との組み合わせも可能
	for _, doc := range sDocs {
		fmt.Println(doc)
	}

	// 配列や構造体は値そのものを保持しているので、そのデータのアドレスを渡すときには、このようにアンパサンドが必要
	updateDocsArray(&aDocs)
	fmt.Println(aDocs) // 出力: [mameShiba bulldog toy poodle]
}

func updateDocsArray(aDocs *[3]string) {
	aDocs[0] = "mameShiba"
}

スライス

package main

import (
	"fmt"
)

func main() {
	// スライス: 宣言後でも要素数を増減できる
	sDocs := []string{"shiba", "bulldog", "toy poodle"}
	sDocs = append(sDocs, "chihuahua")
	fmt.Println(len(sDocs)) // 出力4

	// スライスはその変数自体がアドレスを保持するポインタなので、こちらにアンパサンドは不要
	updateDocsSlice(sDocs)
	fmt.Println(sDocs) // 出力: [shiroMameShiba bulldog toy poodle chihuahua]
}

func updateDocsSlice(sDocs []string) {
	sDocs[0] = "shiroMameShiba"
}

マップ

package main

import (
	"fmt"
)

func main() {
	// マップ
	dogWeights := map[string]int{
		"shiba":   10,
		"bulldog": 12,
	}
	for doc, weight := range dogWeights {
		fmt.Println(fmt.Sprintf("%sの体重は%dです", doc, weight))
		// 出力
		// shibaの体重は10です
		// bulldogの体重は12です
	}

	// マップはその変数自体がアドレスを保持するポインタなので、こちらにアンパサンドは不要
	updateDocsMap(dogWeights)
	fmt.Println(dogWeights) // 出力: map[bulldog:12 shiba:15]
}

func updateDocsMap(dogWeights map[string]int) {
	dogWeights["shiba"] = 15
}