在匿名地图中指定字段名称

问题描述 投票:0回答:1

我的程序从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等?

go go-templates
1个回答
1
投票

很难确定我的答案,因为您没有提供正在使用的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中修改我的示例,以便它复制您的问题?

© www.soinside.com 2019 - 2024. All rights reserved.