web-dev-qa-db-ja.com

Golang埋め込み構造型

私はこれらのタイプがあります:

type Value interface{}

type NamedValue struct {
    Name  string
    Value Value
}

type ErrorValue struct {
    NamedValue
    Error error
}

Use v := NamedValue{Name: "fine", Value: 33}を使用できますが、私はnotを使用できますe := ErrorValue{Name: "alpha", Value: 123, Error: err}

埋め込み構文は問題ないようですが、それを使用しても機能しませんか?

18
Ayman

埋め込み型は(名前のない)フィールドであり、非修飾型名によって参照されます。

仕様:構造型:

型で宣言されているが明示的なフィールド名がないフィールドは、anonymous fieldであり、embeddedフィールドまたは埋め込み構造体を入力します。埋め込み型は、型名Tまたは非インターフェイス型名*Tへのポインタとして指定する必要があり、T自体はポインタ型ではない場合があります。 非修飾型名はフィールド名として機能します。

だから試してください:

e := ErrorValue{NamedValue: NamedValue{Name: "fine", Value: 33}, Error: err}

複合リテラルでフィールド名を省略した場合にも機能します。

e := ErrorValue{NamedValue{"fine", 33}, err}

Go Playground の例を試してください。

27
icza

Iczaによるすばらしい答えに加えて。

あなたはこれを簡単に行うことができます:

v := NamedValue{Name: "fine", Value: 33}
e := ErrorValue{NamedValue:v, Error: err}

そしてそれはうまく動作します。例を確認してください Here