给定模板:
{{range $i, $e := .SomeField}}
{{if $i}}, {{end}}
$e.TheString
{{end}}
这可以输出:
one, two, three
但是,如果我要输出:
one, two, and three
我需要知道哪个是上述范围内的最后一个元素。
我可以设置一个变量,该变量保留数组的长度.SomeField
,但是始终为3,并且$i
上面的值永远只能为2。而且,根据我所见,您无法在模板中执行算术运算。
是否可以检测模板范围内的最后一个值?干杯。
这可能不是最优雅的解决方案,但却是我能找到的最好的解决方案:
http://play.golang.org/p/MT91mLqk1s
package main
import (
"os"
"reflect"
"text/template"
)
var fns = template.FuncMap{
"last": func(x int, a interface{}) bool {
return x == reflect.ValueOf(a).Len() - 1
},
}
func main() {
t := template.Must(template.New("abc").Funcs(fns).Parse(`{{range $i, $e := .}}{{if $i}}, {{end}}{{if last $i $}}and {{end}}{{$e}}{{end}}.`))
a := []string{"one", "two", "three"}
t.Execute(os.Stdout, a)
}
注意: 您也可以使用以下len
功能(不计入Russ Cox
的功能)进行反射:http :
//play.golang.org/p/V94BPN0uKD
cf
问题内容: 我有这样的代码: 它会输出: 键:a值:b,键:c值:d, 但我想要这样的东西: 键:a值:b,键:c值:d 我不需要最后一个逗号,如何删除它。我在这里找到了用于循环数组的解决方案:https : //groups.google.com/d/msg/golang- nuts/XBScetK-guk/Bh7ZFz6R3wQJ ,但是我无法获取地图索引。 问题答案: 这是使用模板函数编写逗
问题内容: 该程序输出简单 1,4,2, 但我想打印 1,4,2。 如您所见,逗号是在数组的每个项目之后打印的。 有没有一种方法可以更改,并确保最后一项将打印“。” 代替 ”,” 问题答案: 您可以使用 实现这一目标。诀窍是首先发出逗号分隔符,而不是该范围内的第一项。
问题内容: 我有以下三个简单的T-SQL查询。第一个是获取一定范围内的记录(DATETIME类型): 第二个是获取最接近@startDT的记录(DATETIME类型) 最后一个是获取@endDT之后最接近的记录: 我想将以上三个查询的所有记录作为一组记录。我尝试使用UNION,但似乎UNION中的子查询不允许使用ORDER BY子句。有没有有效的方法来得到我的结果? 上图仅将* s的记录显示为我的
问题内容: 在或中时,将更改的范围。您如何访问调用范围? 问题答案: 记录在文本/模板文档中: 开始执行时,将$设置为传递给Execute的数据参数,即dot的起始值。
问题内容: 我正在尝试使用go的模板系统编写一个像这样的字符串:(p1,p2,p3),其中p1,p2,…来自程序中的数组。我的问题是如何为最后一个(或第一个)元素正确放置逗号。 我的非工作版本输出(p1,p2,p3,)如下所示: 到目前为止,我的最佳线索是在以下声明中的http://golang.org/pkg/text/template/。 如果“范围”操作初始化变量,则将变量设置为迭代的连续元
对于我的Java类,我正在编写一个小程序,首先选择一个介于1和100之间的数字。然后,它会提示用户开始猜测正确的。如果用户对的猜测过高或过低,程序会打印出一个新范围,供他们在该范围内进行猜测。如果用户输入或,程序只需重新要求用户输入,但不会以任何方式更改范围。 示例输出(当机密号为20时)如下所示: 该项目似乎已经基本完成,但只有一个例外。其中一个要求是,当用户键入的超出我们给定的1和100范围时