Go模板删除范围循环中的最后一个逗号
Go template remove the last comma in range loop
我有这样的代码:
package main
import (
"text/template"
"os"
)
func main() {
type Map map[string]string
m := Map {
"a": "b",
"c": "d",
}
const temp = `{{range $key, $value := $}}key:{{$key}} value:{{$value}},{{end}}`
t := template.Must(template.New("example").Parse(temp))
t.Execute(os.Stdout, m)
}
它将输出:
key:a value:b,key:c value:d,
但我想要这样的东西:
key:a value:b,key:c value:d
我不需要最后一个逗号,如何去掉它。我在这里找到了循环数组的解决方案:https://groups.google.com/d/msg/golang-nuts/XBScetK-guk/Bh7ZFz6R3wQJ,但我无法获取地图的索引。
以下是使用模板函数编写逗号分隔的键值对的方法。
声明一个函数,该函数 returns 一个递增函数和 returns 一个计数器:
func counter() func() int {
i := -1
return func() int {
i++
return i
}
}
将此函数添加到模板中:
t := template.Must(template.New("example").Funcs(template.FuncMap{"counter": counter}).Parse(temp))
像这样在模板中使用它:
{{$c := counter}}{{range $key, $value := $}}{{if call $c}}, {{end}}key:{{$key}} value:{{$value}}{{end}}
此模板将分隔符写在键值对之前而不是键值对之后。
计数器在循环之前创建,并在循环的每次迭代中递增。分隔符不是第一次通过循环写入。
模板中的逻辑可以通过将 if 语句移动到 Go 代码中来简化:
func separator(s string) func() string {
i := -1
return func() string {
i++
if i == 0 {
return ""
}
return s
}
}
将函数添加到模板:
t := template.Must(template.New("example").Funcs(template.FuncMap{"separator": separator}).Parse(temp))
这样使用:
{{$s := separator ", "}}{{range $key, $value := $}}{{call $s}}key:{{$key}} value:{{$value}}{{end}}
从 Go 1.11 开始 it is now possible to change values of template variables。这使我们有可能在不需要自定义函数(在模板之外)的情况下执行此操作。
以下模板可以做到这一点:
{{$first := true}}
{{range $key, $value := $}}
{{if $first}}
{{$first = false}}
{{else}}
,
{{end}}
key:{{$key}} value:{{$value}}
{{end}}
下面是问题的修改后的工作示例:
type Map map[string]string
m := Map{
"a": "b",
"c": "d",
"e": "f",
}
const temp = `{{$first := true}}{{range $key, $value := $}}{{if $first}}{{$first = false}}{{else}}, {{end}}key:{{$key}} value:{{$value}}{{end}}`
t := template.Must(template.New("example").Parse(temp))
t.Execute(os.Stdout, m)
哪些输出(在 Go Playground 上尝试):
key:a value:b, key:c value:d, key:e value:f
我使用下面的模板正确格式化了一些 JSON 使用 go 模板。
它处理任意大小或空的集合。
{{- define "JoinList" -}}
{{- $lastIndex := math.Sub (len .) 1 -}}
{{- range $index, $property := . -}}
{{ if isKind "string" $property.value }}
"{{ $property.key }}": "{{ $property.value }}"{{ if ne $index $lastIndex }},{{ end }}
{{- else -}}
"{{ $property.key }}": {{ $property.value }}{{ if ne $index $lastIndex }},{{ end }}
{{ end }}
{{- end -}}
{{- end -}}
我有这样的代码:
package main
import (
"text/template"
"os"
)
func main() {
type Map map[string]string
m := Map {
"a": "b",
"c": "d",
}
const temp = `{{range $key, $value := $}}key:{{$key}} value:{{$value}},{{end}}`
t := template.Must(template.New("example").Parse(temp))
t.Execute(os.Stdout, m)
}
它将输出:
key:a value:b,key:c value:d,
但我想要这样的东西:
key:a value:b,key:c value:d
我不需要最后一个逗号,如何去掉它。我在这里找到了循环数组的解决方案:https://groups.google.com/d/msg/golang-nuts/XBScetK-guk/Bh7ZFz6R3wQJ,但我无法获取地图的索引。
以下是使用模板函数编写逗号分隔的键值对的方法。
声明一个函数,该函数 returns 一个递增函数和 returns 一个计数器:
func counter() func() int {
i := -1
return func() int {
i++
return i
}
}
将此函数添加到模板中:
t := template.Must(template.New("example").Funcs(template.FuncMap{"counter": counter}).Parse(temp))
像这样在模板中使用它:
{{$c := counter}}{{range $key, $value := $}}{{if call $c}}, {{end}}key:{{$key}} value:{{$value}}{{end}}
此模板将分隔符写在键值对之前而不是键值对之后。
计数器在循环之前创建,并在循环的每次迭代中递增。分隔符不是第一次通过循环写入。
模板中的逻辑可以通过将 if 语句移动到 Go 代码中来简化:
func separator(s string) func() string {
i := -1
return func() string {
i++
if i == 0 {
return ""
}
return s
}
}
将函数添加到模板:
t := template.Must(template.New("example").Funcs(template.FuncMap{"separator": separator}).Parse(temp))
这样使用:
{{$s := separator ", "}}{{range $key, $value := $}}{{call $s}}key:{{$key}} value:{{$value}}{{end}}
从 Go 1.11 开始 it is now possible to change values of template variables。这使我们有可能在不需要自定义函数(在模板之外)的情况下执行此操作。
以下模板可以做到这一点:
{{$first := true}}
{{range $key, $value := $}}
{{if $first}}
{{$first = false}}
{{else}}
,
{{end}}
key:{{$key}} value:{{$value}}
{{end}}
下面是问题的修改后的工作示例:
type Map map[string]string
m := Map{
"a": "b",
"c": "d",
"e": "f",
}
const temp = `{{$first := true}}{{range $key, $value := $}}{{if $first}}{{$first = false}}{{else}}, {{end}}key:{{$key}} value:{{$value}}{{end}}`
t := template.Must(template.New("example").Parse(temp))
t.Execute(os.Stdout, m)
哪些输出(在 Go Playground 上尝试):
key:a value:b, key:c value:d, key:e value:f
我使用下面的模板正确格式化了一些 JSON 使用 go 模板。
它处理任意大小或空的集合。
{{- define "JoinList" -}}
{{- $lastIndex := math.Sub (len .) 1 -}}
{{- range $index, $property := . -}}
{{ if isKind "string" $property.value }}
"{{ $property.key }}": "{{ $property.value }}"{{ if ne $index $lastIndex }},{{ end }}
{{- else -}}
"{{ $property.key }}": {{ $property.value }}{{ if ne $index $lastIndex }},{{ end }}
{{ end }}
{{- end -}}
{{- end -}}