web-dev-qa-db-ja.com

エクスポートされていないフィールドを含むGolangstructリテラル構文

私は大きな構造体を持っていますが、これまでは構造体リテラル構文でインスタンス化していました。例:

Thing{
  "the name",
  ...
}

エクスポートされていないフィールドThing構造体を追加したところ、Goが文句を言っています:implicit assignment of unexported field 'config' in Thing literal

構造体にエクスポートされていないフィールドがある場合でも、リテラル構文を引き続き使用できる方法はありますか?

5
jbrown

リテラルでキー付き値を使用する場合にのみ、 複合リテラル を使用して別のパッケージで定義された構造体タイプの値を作成できます。その場合、すべてのフィールドに初期値を指定する必要がないため、エクスポートされていないフィールドを除外できます(宣言パッケージのみが設定/変更できます)。

タイプが同じパッケージで宣言されている場合は、エクスポートされていないフィールドも設定できます。

t := Thing{
    Name:           "the name",
    someUnexported: 23,
}

ただし、エクスポートされたフィールドの初期値を提供できるのは、型が別のパッケージで宣言されている場合のみです。これは驚くことではありません。

t := otherpackage.Thing{
    Name: "the name",
    // someUnexported will implicitly be its zero value
}

エクスポートされていないフィールドの型の値がゼロ以外の構造体の値が必要な場合は、パッケージ自体が何らかのコンストラクターまたは初期化子(またはセッターメソッド)をエクスポートする必要があります。これは、(パッケージの)外部からエクスポートされていないフィールドを変更/設定することはできません。

関連する質問を参照してください: エクスポートされていないフィールドを持つ構造を複製する方法は?

11
icza

追加するもう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
}
4