interfaceにnil代入したときの挙動がよくわからない
package main import ( "fmt" ) type hoge interface { doHoge() } type hogeStr string func (hs hogeStr) doHoge() { } func main() { var hs *hogeStr = nil fmt.Printf("hs:%s, isNil:%s\n", hs, hs == nil) var hg hoge = nil fmt.Printf("hg:%s, isNil:%s\n", hg, hg == nil) hg = hs fmt.Printf("hg:%s, isNil:%s\n", hg, hg == nil) }
↓結果
hs:%!s(*main.hogeStr=<nil>), isNil:%!s(bool=true) hg:%!s(<nil>), isNil:%!s(bool=true) hg:%!s(*main.hogeStr=<nil>), isNil:%!s(bool=false)
nilを直接代入した場合(2番目)とポインタ変数経由でnilを代入した場合(3番目)でnilとの比較の結果が変わる。
書籍には「interface型変数には値と型が代入される為」と説明されていたが、ここで値(nil)をチェックするにはどうしたらいいのかな?