Collections
map: nil mapは読み取りできても書き込みでpanicになる
nil mapへの読み取りはゼロ値を返しますが、代入するとpanicします。
Sourcenil_write.go
Go 1.22
package mapexample
func ReadNilMap() int {
var scores map[string]int
return scores["missing"]
}
func WriteNilMapPanics() (recovered any) {
var scores map[string]int
defer func() {
recovered = recover()
}()
scores["go"] = 1
return nil
}Testnil_write_test.go
Go 1.22
package mapexample
import "testing"
func TestNilMapは読み取りできても書き込みでpanicになる(t *testing.T) {
if got := ReadNilMap(); got != 0 {
t.Fatalf("ReadNilMap() = %d, want 0", got)
}
if recovered := WriteNilMapPanics(); recovered == nil {
t.Fatal("WriteNilMapPanics() did not panic")
}
}01Assertion
このテストで確認できること
- nil mapから未登録キーを読むと0になる
- nil mapへの代入はpanicする
mapを更新する責務を持つ関数では、make済みであることを呼び出し規約にするか、初期化を関数側へ閉じ込めます。読み取りできるためnilのまま気付きにくい点が落とし穴です。
OBSERVED RESULT
read nil map: 0
write nil map: panic: assignment to entry in nil map