ホームページ >バックエンド開発 >Golang >Go 関数呼び出しの結果でポインター メソッドを呼び出せないのはなぜですか?

Go 関数呼び出しの結果でポインター メソッドを呼び出せないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-19 10:08:15996ブラウズ

Why Can't I Call a Pointer Method on the Result of a Go Function Call?

「アドレスを取得できません」エラーと「ポインター メソッドを呼び出すことができません」エラーについて

Go を使用する場合、エラーが発生する可能性があります「のアドレスを取得できません」または「ポインタ メソッドを呼び出すことができません」など、学習者を混乱させます。 language.

問題:

次の Go コードを考えてみましょう:

diff := projected.Minus(c.Origin)
dir := diff.Normalize() // error: cannot call pointer method on Vector3

// Vector3 methods
func (a *Vector3) Minus(b Vector3) Vector3 { ... }
func (a *Vector3) Normalize() Vector3 { ... }

Vector3.Normalize() のため、2 行目はコンパイル エラーを引き起こします。ポインタ レシーバが必要です。つまり、Vector3 の代わりに Vector3 値 (*Vector3) へのポインタが必要です。 value.

それが起こる理由:

関数およびメソッド呼び出しの戻り値は Go ではアドレス指定できません。したがって、2 番目の例では、コンパイラーは Vector3.Minus() の結果のアドレスを取得できず、その値に対して Normalize() を呼び出すことができません。

考えられる解決策:

  • 個別の代入: 戻り値を変数に代入し、 dir = diff.Normalize() が機能する最初の例で見られるように、その変数のメソッドを使用します。
  • Change Receiver Type: 値レシーバー (Vector3) を持つように Normalize() メソッドを変更します。 *Vector3 の代わりに)。これにより、非ポインター値に対するメソッド呼び出しの連鎖が可能になります。
  • リターン ポインター: 戻り値のアドレス指定の必要性を避けるために、Normalize() がポインター (*Vector3) を返すようにします。
  • ヘルパー関数の作成: pv(v) など、値のアドレスを返す関数を作成します。 &v を返し、その結果に対して Normalize() を呼び出します。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。