我的程序从TOML文件中获取名为Data的嵌入式结构的数据:
===
[custom]
Data = [
{ filename = "fb.jpg", alt = "FB logo", url = "facebook.com" },
{ filename = "pi.jpg", alt = "Pinterest logo", url = "pinterest.com"},
{ filename = "twit.jpg", alt = "Twitter logo", url = "twitter.com"},
]
===
它被声明为接口,所以我事先不知道字段名称。我想遍历行并以HTML构建图像。我可以像这样成功地进行迭代。显然,这一次会打印出每个列的值:
{{ with .FrontMatter.Custom.Data }}
{{ range $_, $value := . }}
{{ range $_, $t := $value}} {{$t}}, {{end}}
{{ end }}
{{ end }}
但是对于我的一生,我无法进入各个领域。我想这样做,但是会导致运行时错误:
{{ range $_, $t := $value}} {{index $value "filename" }}, {{end}}
如何获得$ value.filename,$ value.alt等的所有权?
最佳答案
很难确定我的答案,因为您没有提供正在使用的toml库的详细信息(我假设为BurntSushi)或生成的数据结构(包括fmt.Printf("%v", outVar)
的输出,其中outVar是与未编组的接口) toml,将很有用)。
但是,如果我的假设是正确的,那么问题似乎是正确的。在您的toml文件中,您具有[custom]
,但是在模板中,它是{{ with .FrontMatter.Custom.Data }}
(请注意,自定义中的c是不同的情况)。正如您所说的那样,进行迭代确实没有任何意义,但是使用模板和提供的数据似乎都可以(我猜缺少一些细节)。
下面的示例代码按预期工作:
package main
import (
"bytes"
"fmt"
"github.com/BurntSushi/toml"
"html/template"
)
func main() {
dataToml := `
[custom]
Data = [
{ filename = "fb.jpg", alt = "FB logo", url = "facebook.com" },
{ filename = "pi.jpg", alt = "Pinterest logo", url = "pinterest.com"},
{ filename = "twit.jpg", alt = "Twitter logo", url = "twitter.com"},
]`
var data interface{}
if _, err := toml.Decode(dataToml, &data); err != nil {
panic(err)
}
fmt.Printf("data: %v\n", data)
tmpl := `{{ with .custom.Data }}
{{ range $_, $value := . }}
{{index $value "filename" }}
{{ end }}
{{ end }}`
t := template.Must(template.New("tomlStuff").Parse(tmpl))
var b bytes.Buffer
err := t.ExecuteTemplate(&b, "tomlStuff", data)
if err != nil {
panic(err)
}
fmt.Printf("%v\n", b.String())
}
我很可能错过了一些事情。如果是这样,也许您可以在go playground中修改我的示例,以便它复制您的问题?
关于go - 在匿名 map 中指定字段名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58784996/