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

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

Susan Sarandon
リリース: 2024-12-23 14:09:17
オリジナル
776 人が閲覧しました

How Can I Clone Go Structs with Unexported Fields?

エクスポートされていないフィールドを持つ構造体の複製

Go では、エクスポートされていないフィールドを持つ構造体はオブジェクトの複製に課題をもたらします。次のように定義された型を考えてみましょう:

type T struct {
    S  string
    is []int
}
ログイン後にコピー

以下のような単純な代入では、独立したコピーは作成されません:

p := T{"some string", []int{10, 20}}
q := p
ログイン後にコピー

これは、型のエクスポートされていないフィールドにアクセスできず、エクスポートできないためです。

カスタムによるクローン作成Method

回避策の 1 つは、その型を所有するパッケージ内で Clone メソッドを提供することです。ただし、これは同じパッケージ内の型に対してのみ機能します。

サードパーティ型の制限

エクスポートされていないフィールドを持つ型がサードパーティ パッケージに存在する場合、クローンを直接作成する方法はありません。これは仕様によるもので、エクスポートされていないフィールドは宣言するパッケージに対してプライベートのままである必要があります。

代替アプローチ

エクスポートされていないフィールドを複製することはできませんが、作成することは可能です。空 (ゼロ) の値を持つ新しい構造体フィールド:

var r somepackage.T
s := somepackage.T{S: p.S}
ログイン後にコピー

安全でない慣行

予期しない潜在的に安全ではない動作につながる可能性があるため、安全ではないパッケージの使用はこの目的には推奨されません。

エクスポートされていないものをコピーしていますフィールド

ある構造体を同じ型の別の構造体に代入する場合、エクスポートされていないフィールドは適切にコピーされます。ただし、これらのフィールドを変更することはできません (nil または元のポインタ値と同じ値のみにすることができます)。

type person struct {
    Name string
    age  *int
}

age := 22
p := &person{"Bob", &age}

p2 := new(person)
*p2 = *p // Copy unexported field

fmt.Println(p2) // Outputs: &{Bob 0x414020}
ログイン後にコピー

以上がエクスポートされていないフィールドを含む Go 構造体のクローンを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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