結論
type Dog struct {
Name string
}
func (d *Dog) Speak() {
fmt.Printf("Woof")
}
func main() {
var nilPoint *Dog
nilPoint.Speak()
}
上記のコード動くと思いますか?
.
.
.
タイトルがネタバレになってる感すごいですが、動きます。
ちゃんとWoof
が出力されます。
ポインタレシーバに対するメソッド呼び出しは、nilポインタに対してでも正常に行えます。
あまり業務で使う機会はないと思いますが、初めて知った時結構びっくりしたので備忘録として残しておきます。
余談
当然ですが、構造体のプロパティを参照している場合panicが発生します。
type Dog struct {
Name string
}
func (d *Dog) Speak() {
fmt.Printf("Woof, I am %s\n", d.Name)
}
func main() {
var nilPoint *Dog
nilPoint.Speak() // => panic発生
}
終わりに
勝手に「そんなメソッド定義してないよ」的なエラーが出ると思ったのですが、動くみたいです。
「プロパティの参照が起こらない限りはnil値の操作は問題がない」ということは覚えておいたらいつかどこかで役立つかもしれません。
余談にある通りですが、呼び出し自体が動作してもプロパティを参照しようとするとpanicが発生するので、参照する場合はnil
ガードを入れるのが無難なのかなと思いました。