ホームページ > バックエンド開発 > Golang > メソッドをチェーンするときに Go が「アドレスを取得できません」または「ポインタ メソッドを呼び出すことができません」というエラーを返すのはなぜですか?

メソッドをチェーンするときに Go が「アドレスを取得できません」または「ポインタ メソッドを呼び出すことができません」というエラーを返すのはなぜですか?

Barbara Streisand
リリース: 2024-12-12 18:18:14
オリジナル
428 人が閲覧しました

Why Does Go Return

Go のポインター関連のエラーについて

Go では、「のアドレスを取得できません」や「次のアドレスを取得できません」などのエラーが発生することがあります。ポインタを操作するときは、ポインタ メソッドを呼び出す必要があります。この質問と回答では、これらのエラーの背後にある理由を調査し、考えられる回避策を示します。

コンパイルして動作する次のコードを考えてみましょう:

ただし、2 つの操作を組み合わせようとすると、

を 1 行にまとめます。前述のエラーが発生します。その理由を理解するには、Go のレシーバーの型と値のアドレス指定可能性を詳しく調べる必要があります。

ポインター レシーバーとアドレス指定可能

Vector3 の Normalize() メソッドには、ポインター レシーバー (*Vector3)。Vector3 値へのポインターを呼び出す必要があることを示します。ショートカット diff.Normalize() を使用すると、コンパイラーは diff 変数 (&diff) のアドレスを自動的に取得して、必要なポインター レシーバーの型と一致させます。

ただし、2 番目の例では、 diff.Minus(c .Origin) は、アドレス指定できない Vector3 値を返します。これは、コンパイラーがそのアドレスを取得して Normalize() に渡すことができないことを意味します。

ポインター レシーバーとアドレス指定可能性の回避策

この問題には、いくつかの回避策があります。

  • 変数に代入し、メソッドを個別に呼び出します: Minus() の結果を変数に保存し、その変数に対して Normalize() を呼び出します。
  • ポインター戻り型のヘルパー関数を作成します。 ポインターを返すヘルパー関数を実装します。これにより、戻り値に対して Normalize() を直接呼び出すことができます。
  • メソッド レシーバーと結果を変更するタイプ: Normalize() のレシーバーを値レシーバー (Vector3) に変更し、戻り値の型をポインター (*Vector3) に変更します。
  • ポインターを返すメソッドを使用します: それ自体へのポインターを返すメソッドを Vector3 に実装し、それを呼び出して使用できるようにします。 Normalize().

その他の考慮事項

  • ポインター レシーバーではメソッドによるレシーバーの変更が許可されますが、値レシーバーでは許可されないことに注意してください。
  • コードではポインター/値レシーバーと結果の型を一貫して使用することをお勧めします
  • Vector3 のような単純な型の場合、通常、ポインターの使用によるパフォーマンス上の重大な懸念はありません。

以上がメソッドをチェーンするときに Go が「アドレスを取得できません」または「ポインタ メソッドを呼び出すことができません」というエラーを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート