Collections
slice: nilと空sliceはJSONで異なる
どちらもlenは0ですが、nil sliceはJSONでnull、空sliceは[]になります。
Sourcenil.go
Go 1.22
package sliceexample
import "encoding/json"
func Marshal(values []string) (string, error) {
encoded, err := json.Marshal(values)
return string(encoded), err
}
func IsNil(values []string) bool {
return values == nil
}Testnil_test.go
Go 1.22
package sliceexample
import "testing"
func TestNilSliceと空sliceはJSONで異なる値になる(t *testing.T) {
nilJSON, err := Marshal(nil)
if err != nil {
t.Fatal(err)
}
emptyJSON, err := Marshal([]string{})
if err != nil {
t.Fatal(err)
}
if nilJSON != "null" || emptyJSON != "[]" {
t.Fatalf("nil = %s, empty = %s", nilJSON, emptyJSON)
}
}
func TestNilSliceだけがnilと比較してtrueになる(t *testing.T) {
if !IsNil(nil) || IsNil([]string{}) {
t.Fatal("nil slice and empty slice must be distinguished")
}
}01Assertion
このテストで確認できること
- nil sliceはnilと比較してtrueになる
- encoding/jsonはnilをnull、空sliceを[]として出力する
APIの配列フィールドではnullと[]の意味を先に決めます。空配列を契約にしたい場合は、外部へ出す直前に非nilの空sliceへそろえます。
OBSERVED RESULT
nil slice JSON: null
empty slice JSON: []