例えば下記の Person のような型 (type) を定義したとする。
type Person struct {
ID int
Name struct {
First string
Last string
}
}
これを下記のように初期化すると「missing type in composite literal」というエラーが出る。
func main() {
p := Person{
ID: 1,
Name: {
First: "neco",
Last: "nekomura",
},
}
}
要は 「Name の所が型 (type) の名前が抜けてる (missing) から型の名前書いて」ということらしい。
無名の struct なので名前なんて無い。ので書きようがない。
が、解決方法が3つある。
解決方法1
無名の struct を初期化する時は下記のように書くらしい。
これは可読性が下がる。
func main() {
p := Person{
ID: 1,
Name: struct{
First string
Last string
}{
First: "neco",
Last: "nekomura",
},
}
}
解決方法2
おそらく一般的。
よくわからない型が1つ生まれることによって解決する。
type Person struct {
ID int
Name Name
}
type Name struct {
First string
Last string
}
func main() {
p := Person{
ID: 1,
Name: Name{
First: "neco",
Last: "nekomura",
},
}
}
解決方法3
初期化時に代入するのを諦め、後で代入する。
func main() {
p := Person{
ID: 1,
}
p.Name.First = "neco"
p.Name.Last = "nekomura"
}
番外編
そもそも書きづらいということはアプローチの仕方が間違っている。
という自分の考え。
import "fmt"
type Person struct {
ID int
FirstName string
LastName string
}
func (p *Person) Name() string {
return FirstName + " " + LastName
}
func main() {
p := Person{
ID: 1,
FirstName: "neco",
LastName: "nekomura",
}
fmt.Printf(p.Name())//neco nekomura
}
Go言語では明確にネストしたほうが良いケースとそうでないケースがあって、
何でもかんでもネストしない方が結果的に良いということなのかもしれない。