模板:访问结构切片的嵌套字段

Templates: accessing nested fields of slice of structs

我想使用 go 模板输出 slice[0].type。打印作品时:

{{ index .Slice 0 | printf "%+v" }} // {Type:api.Meter ShortType:Meter VarName:meter}

打印字段不会:

{{ index .Slice 0 | .Type }} // template: gen:43:26: executing "gen" at <.Type>: can't evaluate field Type in type struct { API string; Package string; Function string; BaseTypes []main.baseType; Types map[string]main.typeStruct; Combinations [][]string }

错误消息表明计算了外部循环字段,而不是 index 调用的结果。

访问切片嵌套字段的正确语法是什么?

printf 是内置模板函数。当您将 index .Slice 0 链接到 printf 时,该值将作为最后一个参数传递给 printf。访问 Type 字段不是函数调用,您不能链接到它。 .Type 链中的值将在当前“点”上计算,链接不会更改点。

使用括号对切片表达式进行分组,然后应用字段选择器:

{{ (index .Slice 0).Type }}

测试示例:

type Foo struct {
    Type string
}

t := template.Must(template.New("").Parse(`{{ (index .Slice 0).Type }}`))

params := map[string]interface{}{
    "Slice": []Foo{{Type: "Bar"}},
}

if err := t.Execute(os.Stdout, params); err != nil {
    panic(err)
}

哪些输出(在 Go Playground 上尝试):

Bar