エクスポートされていないフィールドを持つ構造体を複製するには?
Go では、エクスポートされていないフィールドを持つ構造体は、オブジェクトの複製時に問題を引き起こします。構造体のフィールドがエクスポートされていない場合、宣言しているパッケージの外で構造体にアクセスしたり変更したりすることはできません。
問題:
次の T 構造体を考えてみましょう:
type T struct { S string is []int }
ある T オブジェクトを別の T オブジェクトに代入しても、エクスポートされていないフィールドは独立したコピーを作成しません。
解決策 1: Clone メソッド
最も簡単な解決策は、T が定義されているパッケージに Clone メソッドを提供することです。このメソッドは、エクスポートされていないフィールドを含む T のフィールドを明示的にコピーできます。
解決策 2: Setters
Clone メソッドを提供することが不可能な場合は、setter を提供します。 SetIs() などのエクスポートされていないフィールドの関数を使用すると、 field.
制限事項:
これらのソリューションは、その型のソース コードが利用できるかどうかに依存していることに注意することが重要です。サードパーティのパッケージを使用する場合、元のパッケージを変更しないと、エクスポートされていないフィールドを含む構造のクローンを作成できない場合があります。
安全でないアプローチ (非推奨):
unsafe パッケージを使用すると、エクスポートされていないフィールドへのアクセス制限がバイパスされる可能性があります。このアプローチは、Go のカプセル化原則に違反し、次のような問題が発生する可能性があるため、強くお勧めできません。ランタイム エラー。
代替オプション:
エクスポートされていないフィールドの変更が必須ではない場合は、目的のデータを別のクローン構造に抽出することを検討してください。たとえば、エクスポートされていないフィールドは、初期値を保持しながらリフレクションを使用して抽出できます。
var r T s := T{S: p.S}
結論:
エクスポートされていないフィールドを含む構造のクローン作成には、慎重な検討が必要です。パッケージ固有のソリューションが含まれる場合があります。利用可能なオプションを評価しながら、コードの安全性とカプセル化を優先することが重要です。
以上がエクスポートされていないフィールドを含む Go 構造体のクローンを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。