概要
ネストしたstructに値を入れる方法と実践での注意点。
記述方法
基本的には以下のルールで記述が可能。
main.go
package main
import "fmt"
type A struct {
AKey1 string
AKey2 string
B
}
type B struct {
BKey1 string
BKey2 string
}
func main() {
// key:valueで記述が可能
var st1 = A{
AKey1: "val1",
AKey2: "val2",
B: B{
BKey1: "val3",
BKey2: "val4",
},
}
// keyの省略も可能
var st2 = A{
"val1",
"val2",
B{
"val3",
"val4",
},
}
//宣言してから 変数.key = val でも可能
var st3 = A{}
st3.AKey1 = "val1"
st3.AKey2 = "val2"
st3.BKey1 = "val3"
st3.BKey2 = "val4"
fmt.Printf("%#v\n", st1)
fmt.Printf("%#v\n", st2)
fmt.Printf("%#v\n", st3)
//=> main.A{AKey1:"val1", AKey2:"val2", B:main.B{BKey1:"val3", BKey2:"val4"}}
}
実践における注意点
「B:B{}」の部分も「key:value{}」なので注意。
B: B{BKey1: "val3",BKey2: "val4",},
//=> key: value{BKey1: "val3",BKey2: "val4",}
したがってstructを以下の様に別のpackageにしてまとめている場合は、packageをimportして以下の様にしなければならない。
model.go
package model
type A struct {
AKey1 string
AKey2 string
B
}
type B struct {
BKey1 string
BKey2 string
}
main.go
var st1 = model.A{
AKey1: "val1",
AKey2: "val2",
B: model.B{
BKey1: "val3",
BKey2: "val4",
},
}
var st3 = model.A{}
st3.AKey1 = "val1"
st3.AKey2 = "val2"
st3.BKey1 = "val3"
st3.BKey2 = "val4"
// packageが別れている場合、keyを省略した書き方は
// go-vetに「composite literal uses unkeyed fields」と怒られるので注意。
感想
作業中に例の「B:model.B{}」でちょっと詰まったので書き起こした。
とはいえ大体はst3の記述方法が採択されそう。