一尘不染

Google Go文本模板中范围的最后一个元素的特殊情况处理

go

我正在尝试使用go的模板系统编写一个像这样的字符串:(p1,p2,p3),其中p1,p2,…来自程序中的数组。我的问题是如何为最后一个(或第一个)元素正确放置逗号。

我的非工作版本输出(p1,p2,p3,)如下所示:

package main

import "text/template"
import "os"
func main() { 
    ip := []string{"p1", "p2", "p3"}
    temp := template.New("myTemplate")
    temp,_ = temp.Parse(paramList)
    temp.Execute(os.Stdout, ip)

}

const paramList = 
`{{ $i := . }}({{ range $i }}{{ . }}, {{end}})`

到目前为止,我的最佳线索是在以下声明中的http://golang.org/pkg/text/template/

如果“范围”操作初始化变量,则将变量设置为迭代的连续元素。 另外,“范围”可以声明两个变量,以逗号分隔:

$index, $element := pipeline

在这种情况下,$ index和$ element分别设置为数组/切片索引或映射键和元素的连续值。 请注意,如果只有一个变量,则会为其分配元素;这与Go
range子句中的约定相反。建议在哪里索引

这表明可以在迭代中获得索引,但我只是无法弄清楚范围声明两个变量的含义以及在模板中应声明这些变量的位置。


阅读 235

收藏
2020-07-02

共1个答案

一尘不染

请从go-nuts邮件列表中查看此示例。该技巧的一个关键是模板if不同于Go语言if。模板可以测试零值,这与需要布尔值的Go语言不同。然后{{if $index}},{{end}},神奇的地方是$ index除了在赋值中的出现外无需声明。

2020-07-02