標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

IsNil を書いてみた

型が違っても 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言語詳しい人が現れて御高説を始めがちだが、ここは人がこないから大丈夫だろう。分かってて書いてるんだよ。