鉴于模板:

{{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)
}

Note:您也可以不使用len功能进行反射(归功于Russ Cox):

C.F.

Go相关问答推荐

Go 1.22 http mux:在同一路径上提供一个手柄和一个FS

如何在使用中介资源时处理函数中的`defer`

如果values.yaml文件中不存在某个属性,如何返回默认的FALSE?

Kafka架构注册表-Broker:Broker无法验证记录

go mod tidy会自动升级go.mod中的go版本吗?

Go Template 动态获取变量

Go Programming Language书上的例子server2错了吗?

Go struct 匿名字段是公开的还是私有的?

从单词中删除特殊字符

无法将 graphql-ws 连接到 gqlgen

Go gmail api 快速入门导致本地主机拒绝连接 ERR_CONNECTION_REFUSED

为什么此代码在运行命令 error="exec: not started" 时出现错误?

panic :拨号 tcp:在 172.22.64.1:53 上查找 bookstoreDB:没有这样的主机

函数调用中的类型参数panic

跟踪长时间运行的任务的进度 - 正确的方法

为什么我不能使用来自 gocloak 中 Login() 的访问令牌在 KeyCloak 中创建新客户端?

我应该明确地创建一个与Belongs To或Has Many对称的关系吗?

Go 泛型是否与 LINQ to Objects 等效?

在 Go 中表达函数的更好方法( struct 方法)

Beego - 我需要context.Context而不是 Beego 上下文