私は大きな構造体を持っていますが、これまでは構造体リテラル構文でインスタンス化していました。例:
Thing{
"the name",
...
}
エクスポートされていないフィールドThing
構造体を追加したところ、Goが文句を言っています:implicit assignment of unexported field 'config' in Thing literal
。
構造体にエクスポートされていないフィールドがある場合でも、リテラル構文を引き続き使用できる方法はありますか?
リテラルでキー付き値を使用する場合にのみ、 複合リテラル を使用して別のパッケージで定義された構造体タイプの値を作成できます。その場合、すべてのフィールドに初期値を指定する必要がないため、エクスポートされていないフィールドを除外できます(宣言パッケージのみが設定/変更できます)。
タイプが同じパッケージで宣言されている場合は、エクスポートされていないフィールドも設定できます。
t := Thing{
Name: "the name",
someUnexported: 23,
}
ただし、エクスポートされたフィールドの初期値を提供できるのは、型が別のパッケージで宣言されている場合のみです。これは驚くことではありません。
t := otherpackage.Thing{
Name: "the name",
// someUnexported will implicitly be its zero value
}
エクスポートされていないフィールドの型の値がゼロ以外の構造体の値が必要な場合は、パッケージ自体が何らかのコンストラクターまたは初期化子(またはセッターメソッド)をエクスポートする必要があります。これは、(パッケージの)外部からエクスポートされていないフィールドを変更/設定することはできません。
関連する質問を参照してください: エクスポートされていないフィールドを持つ構造を複製する方法は?
追加するもう1つのポイント。構造体のすべてのプロパティは、たとえば大文字で始める必要があります。
t := Thing
{
Name: "the name", // <-- This will work because Name start with capital letter
someUnexported: 23, // <-- this wont work because someUnexported starts with small letter
}