我有一个像这样的模板:
"environment": [ {{- range $k,$v := .env }} { "name": "{{ $k }}", "value": "{{ $v }}" }, {{- end }} ]
我得到下面的输出:
"environment": [ { "name": "name", "value": "test" }, { "name": "region", "value": "us-east-1" }, ]
我想渲染如下:
"environment": [ { "name": "name", "value": "bxbd" }, { "name": "region", "value": "us-east-1" } ]
我无法摆脱最后一个逗号来制作有效的json。还是可能以某种方式将完整的范围块发送到某些自定义联接功能?
这是一个如何使用模板的示例,但是如果要生成JSON,我强烈建议使用第二种方法。
由于您在地图上范围很广,因此您无法(简单地)做到这一点。如果是切片,则可以检查index变量(例如:Go模板除去range循环中的最后一个逗号;并使用go- templates内的range检测数组中的最后一项),但是对于maps则不能这样做。
知道您是否处于第一个(或最后一个)迭代 状态 是您必须维护自己的 状态 。例如,为此使用自定义函数或方法。
这是一个示例实现:
type Params struct { Env map[string]string Counter int } func (p *Params) IncMore() bool { p.Counter++ return p.Counter < len(p.Env) } const src = `"environment": [ {{- range $k,$v := .Env }} { "name": "{{ $k }}", "value": "{{ $v }}" }{{if $.IncMore}},{{end}} {{- end }} ]`
测试它:
func main() { t := template.Must(template.New("").Parse(src)) p := &Params{ Env: map[string]string{ "name": "test", "region": "us-east-1", }, } err := t.Execute(os.Stdout, p) if err != nil { panic(err) } }
输出(在Go Playground上尝试):
"environment": [ { "name": "name", "value": "test" }, { "name": "region", "value": "us-east-1" } ]
encoding/json
如果您的目标是生成JSON,则应使用该encoding/json软件包生成有效的JSON文档。上面的模板不了解JSON语法和上下文,并且映射条目的值在写入输出时不会转义,因此您仍然可能得到无效的JSON。
最好是像这样生成JSON:
type Entry struct { Name string `json:"name"` Value string `json:"value"` } type Params struct { Env []Entry `json:"environment"` } func main() { enc := json.NewEncoder(os.Stdout) enc.SetIndent("", " ") // Optional p := &Params{ Env: []Entry{ {Name: "name", Value: "test"}, {Name: "region", Value: "us-east-1"}, }, } err := enc.Encode(p) if err != nil { panic(err) } }
{ "environment": [ { "name": "name", "value": "test" }, { "name": "region", "value": "us-east-1" } ] }