エイリアス間の代入は Go でのコピーをトリガーしますか?
Go では、エイリアスを使用したカスタム型の定義が可能です。これらのエイリアス タイプ間の変換によってコピーが生じるか、それとも単に構造が変更されるかについて懸念が生じます。
次の例を考えてみましょう:
type MyString string var s = "very long string" var ms = MyString(s) var s2 = string(s) // Are ms or s2 a full copy of s?
Answer:
Go の変換ルールによると、数値型または文字列間の非定数変換では、表現の変更による実行時コスト。ただし、エイリアス間の変換など、他のすべての変換では、コピーを作成せずに元の表現が保持されます。
したがって、ms と s2 はどちらも s の完全なコピーではありませんが、同じ基になる値を参照します。 .
関数呼び出しへの影響:
関数に値を渡す場合、通常、コピーは作成されました。ただし、これはエイリアス型には当てはまりません。エイリアス型の値を関数パラメータに割り当てても、コピーはトリガーされません:
func foo(s MyString){ ... } foo(ms) // No copy is made when passing ms to foo()
要約すると、エイリアス型間の変換では基になる値のコピーは作成されませんが、この原則は関数に値を渡す場合には適用されません。通常、コピーが作成される場所。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3