LoginSignup
9
3

More than 5 years have passed since last update.

golangのembeddingによる継承(っぽい操作)で今更ながら思ったこと

Posted at

今更ながら、こういう仕様だったのか・・・とハマったのでメモ。

goってextendがない代わりにembeddingによる継承っぽいことができますよね。

その際の継承先structの初期化で、 えっ!?この操作できなかったんだ・・・ と今更ながら知ったのでメモです。

まずエラーになるパターン

package main

import (
    "fmt"
)

// 基のstruct。NameとDescriptionを持っている
type Base struct {
    Name        string
    Description string
}

// 拡張?したstruct。ExtraInformationというプロパティを足した
type Extended struct {
    Base
    ExtraInformation string
}

func main() {
    ext := Extended{
        Name:             "name",
        Description:      "description",
        ExtraInformation: "extra",
    }
    fmt.Printf("Struct: %#v", ext)
}

これだと、 cannot use promoted field Base.Description in struct literal of type Extended というエラーになります。

embeddingされている方のフィールドを promoted field と呼ぶようですね。

うまくいくパターン

こうしないと駄目らしい。

package main

import (
    "fmt"
)

// 基のstruct。NameとDescriptionを持っている
type Base struct {
    Name        string
    Description string
}

// 拡張?したstruct。ExtraInformationというプロパティを足した
type Extended struct {
    Base
    ExtraInformation string
}

func main() {
    ext := Extended{
        Base: Base{
            Name:        "name",
            Description: "description",
        },
        ExtraInformation: "extra",
    }
    fmt.Printf("Struct: %#v", ext)
}

もしくはこう。struct literal なるものから脱出さえしていればどうにでもなる系。

package main

import (
    "fmt"
)

type Base struct {
    Name        string
    Description string
}

type Extended struct {
    Base
    ExtraInformation string
}

func main() {
    ext := Extended{}
    ext.Name = "name"
    ext.Description = "description"
    ext.ExtraInformation = "extra"

    fmt.Printf("Struct: %#v", ext)
}

普通にPythonとかで書いている人にとっては意外な仕様だったのでメモしておきました。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3