-Go- nil sliceと空sliceの違い
code:Go
package main
import (
"fmt"
)
type hoge struct{
arr []string
}
func main() {
h := hoge{}
fmt.Println(h.arr == nil)
fmt.Println([]string{} == nil)
}
// true
// false
このコードをみたときに ?jiroshin.icon? となったのでメモ。
Goのスライスには nil slice と 空slice がある。
2つのスライスは宣言しただけかor初期化したかで2つの違いが生まれる。
code:Go
package main
import "fmt"
func main() {
var s1 []int
s2 := []int{}
s3 := make([]int, 0)
fmt.Println("s1", len(s1), cap(s1), s1 == nil, s1:, s1: == nil) fmt.Println("s2", len(s2), cap(s2), s2 == nil, s2:, s2: == nil) fmt.Println("s3", len(s3), cap(s3), s3 == nil, s3:, s3: == nil) }
// s1 0 0 true [] true
// s2 0 0 false [] false
// s3 0 0 false [] false
jiroshin.icon ポイント
nil slice、空sliceはどちらもlen, capが0で同じように見えるが、json化したときの挙動が↓以下のように異なる。
nil slice → null
空slice → []
参考