Go コンストラクターでのアドレス リターンの使用法を理解する: 新しいリターンと直接リターン
明示的なコンストラクターを提供する他の言語とは異なり、Go はコンストラクターの代わりの「新しい」関数。しかし、File オブジェクトを直接返すのではなく、Go の "New" 関数でアドレス (&f) を返すのが一般的なのはなぜですか?
アドレスと直接の戻りの違い
Go の構文では、値 (非ポインター) またはポインターのいずれかを返すことができ、決定は開発者に委ねられます。通常、ポインタは値の方が有用な場合に返されます。これは、戻り値が
1 の場合に特に当てはまります。ポインタ レシーバを持つ複数のメソッドがあります:
メソッドがポインタ レシーバを受け取る場合でも、ポインタを返すと、返されたオブジェクトに対してメソッド呼び出しを直接連鎖させることができます。これにより、戻り値を変数に格納してメソッドを手動で呼び出す必要がなくなります。
2.アドレス指定不可能なデータ構造に格納されます:
マップなどの一部のデータ構造は、値の直接アドレス指定をサポートしません。ポインタを返すとこの制限が回避され、データ構造に格納されている値に対するメソッド呼び出しが可能になります。
3.大きな構造体は頻繁に渡されますか:
ポインタはメモリ使用量とパフォーマンスを最適化するため、頻繁に渡される大きな構造体に有利です。
比較例:
ポインタを受け取るメソッドを備えた単純な構造体を考えてみましょう。レシーバー:
直接戻り値を使用しようとすると:
エラーが発生します:「createMy(12) でポインター メソッドを呼び出すことができません」。ただし、アドレスを返すと:
メソッド呼び出しはエラーなしで成功します。
結論:
を返すかどうかの決定Go の "New" 関数内で直接ポインタまたは値を使用する場合は、返されたオブジェクトの使用目的に基づいています。ポインターは、ポインター レシーバー、アドレス指定不可能なデータ構造、または頻繁に渡される大きな構造体を含むメソッドを扱うときに利点があります。
以上がGo の「New」関数で値の代わりにポインタを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。