Go 模板范围循环引用我的值

Go templates range loop is quoting my value

我有一段字符串 (.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 -}}

有什么建议吗?谢谢。

{{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

如果 Go Template 正在渲染的变量在标签内,那么 Go Template 会为您用引号将任何字符串包装起来。

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