## Go で値がポインタ メソッドを呼び出せるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-10-25 23:58:28
オリジナル
427 人が閲覧しました

## Why Can a Value Invoke a Pointer Method in Go?

Go レシーバー メソッド呼び出し構文: 詳しい説明

「Effective Go」ガイドでは、ポインター メソッドは値メソッドはポインターに対して呼び出すことができますが、値メソッドはポインターまたは値に対して呼び出すことができます。しかし、最近遭遇した問題により、次のコードで値がポインタ メソッドを呼び出すのはなぜですか?

<code class="go">package main

import (
  "fmt"
)

type age int

func (a age) String() string {
  return fmt.Sprintf("%d yeasr(s) old", int(a))
}

func (a *age) Set(newAge int) {
  if newAge >= 0 {
    *a = age(newAge)
  }
}

func main() {
  var vAge age = 5
  pAge := new(age)
  vAge.Set(10) // Compilation successful
}</code>
ログイン後にコピー

これを解決するために、Go 言語仕様に目を向けます。 「呼び出し」の下に、次のように書かれています:

x (の型) のメソッド セットに m が含まれており、引数リストを m のパラメータ リストに割り当てることができる場合、メソッド呼び出し x.m() は有効です。 x がアドレス可能で、&x のメソッド セットに m が含まれている場合、x.m() は (&x).m() の短縮形です。

この場合、vAge はアドレス可能です (*age への型変換は有効です)。 vAge.Set(10) は本質的には (&vAge).Set(10) です。 Set() の受信側の型はポインターであるため、値 vAge はポインター メソッド Set() を呼び出すことができます。

以上が## Go で値がポインタ メソッドを呼び出せるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!