ホームページ >バックエンド開発 >Golang >エクスポートされていないフィールドを含む Go 構造体のクローンを作成するにはどうすればよいですか?

エクスポートされていないフィールドを含む Go 構造体のクローンを作成するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-03 00:49:36958ブラウズ

How Can I Clone a Go Struct with Unexported Fields?

エクスポートされていないフィールドを持つ構造体を複製するには?

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 サイトの他の関連記事を参照してください。

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