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