今更ながら、こういう仕様だったのか・・・とハマったのでメモ。
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とかで書いている人にとっては意外な仕様だったのでメモしておきました。