LoginSignup
12
5

【GO】ある構造体のポイント型に定義されたメソッドは、nilポインタからでも実行できる話

Posted at

結論

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ガードを入れるのが無難なのかなと思いました。

12
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
5