0

我有一段字符串(.Table.PKey.Columns),我试图在我的模板中循环以生成一个执行一些附加的 go 文件,但是当我在模板中输出 $value 时,显然 Go 是为我引用它,所以它给了我错误:

5:27: expected selector or type assertion, found 'STRING' "ID"

即,不是模板输出看起来像o.ID- 这是我的目标,它最终看起来像o."ID"(我想)。

我的假设是否正确,这是使用范围循环的结果?因为似乎当我直接在其他地方访问变量时(例如,假设我有一个字符串并且我做了:)o.{{.Table.MyString}}它工作正常,但是一旦我尝试将范围循环合并到混合中,它似乎是在引用东西。

{{- range $key, $value := .Table.PKey.Columns }}
  args = append(args, o.{{$value}})
{{ end -}}

有什么建议么?谢谢你。

4

2 回答 2

3

{{range}}不引用任何内容。如果您"ID"在输出中看到,那么您的输入值包含 "ID"引号!

看这个例子:

func main() {
    m := map[string]interface{}{
        "Id":     "Id1",
        "Quoted": `"Id2"`,
        "Ids":    []string{"Id1", `"Id2"`, "Abc"},
    }
    t := template.Must(template.New("").Parse(src))
    t.Execute(os.Stdout, m)
}

const src = `{{.Id}} {{index .Ids 0}} {{.Quoted}} 
{{range $key, $value := .Ids}}{{$value}}
{{end}}
`

输出(在Go Playground上试试):

Id1 Id1 "Id2" 
Id1
"Id2"
Abc
于 2016-04-23T16:05:10.933 回答
0

如果 Go Template 正在呈现的变量在标签内,那么 Go Template 将为您包装任何带有引号的字符串。

一些选项包括在要求 Go Template 渲染它之前生成 in 代码。

于 2022-02-20T18:54:40.307 回答