型が違っても nil 判定ができる関数を作ってみた。
package main import ( "fmt" "reflect" ) func IsNil(p interface{}) bool { if p == nil { return true } value := reflect.ValueOf(p) switch value.Kind() { case reflect.Ptr, reflect.Map, reflect.Slice, reflect.Interface, reflect.Chan, reflect.Func: return value.IsNil() default: return false } } type MyError struct{} func (MyError) Error() string { return "MyError" } func main() { var f error = (*MyError)(nil) fmt.Printf("(f == nil )==%v\n", f == nil) fmt.Printf("(IsNil(f) )==%v\n", IsNil(f)) }
$ go run typednil.go (f == nil )==false (IsNil(f) )==true
こんなんを書くとGo言語詳しい人が現れて御高説を始めがちだが、ここは人がこないから大丈夫だろう。分かってて書いてるんだよ。