nil interfaceメモ

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
  • たしかに2は、typeとvalueが両方nilなので、nilと判定されている
  • 3はvaluenilにも関わらず、non nilと判定されている

ポイント

  • interface型の変数がnilであることは、その変数のvaluenilかどうかを示しているわけではない
  • もし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