nil interface
typeとvalueがnilの場合のみ、interface型の変数はnilと判定される(nil interface)
実験
var s *string // #1 fmt.Printf("s -> Type:[%T] Value:[%v] ", s, s) fmt.Println(s == nil) var i interface{} // #2 fmt.Printf("i -> Type:[%T] Value:[%v] ", i, i) fmt.Println(i == nil) i = s // #3 fmt.Printf("i -> Type:[%T] Value:[%v] ", i, i) fmt.Println(i == nil)
# | type | value | nil判定結果 |
---|---|---|---|
1 | *string | nil | true |
2 | nil | nil | true |
3 | *string | nil | false |
ポイント
- interface型の変数がnilであることは、その変数のvalueがnilかどうかを示しているわけではない
- もしinterface型の変数の値がnilかどうか判定したい場合はReflectionを使わなければならない
メモ
ToDo
- interface型の変数にconcrete typeの値を代入した場合、underlying typeとunderlying valueはconcrete typeの値のtypeとvalueで合っているか確認
参考
Understanding nil Interfaces and Interfaces with nil Values in Go