ほげにっき

hogedigoの日記

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)をチェックするにはどうしたらいいのかな?