dictionary - 迭代Go map 获取索引

标签 dictionary go go-templates revel

为了在模板中使用revel even 关键字,我想在使用range进行迭代时获取 map 条目的索引。有什么办法吗?
我的 map 具有以下结构:

map[string][]string

最佳答案

您不仅可以使用模板操作来执行此操作,还可以注册一个提供必要帮助的函数。

您可以注册一个返回一个函数(闭包)的函数,该函数在每次调用时都会改变其返回值(确切地说,“奇数”和“偶数”索引的交替方式):

func isEven() func() bool {
    e := false
    return func() bool {
        e = !e
        return e
    }
}

我将其命名为isEven(),以免与ravel的even()冲突。使用它:
func main() {
    t := template.Must(template.New("").Funcs(template.FuncMap{
        "isEven": isEven,
    }).Parse(templ))

    m := map[string]string{
        "a": "A", "b": "B", "c": "C", "d": "D",
    }
    if err := t.Execute(os.Stdout, m); err != nil {
        panic(err)
    }
}

const templ = `{{$e := isEven}}
{{- range $k, $v := . -}}
    [even:{{call $e}}] key={{$k}}; value={{$v}}
{{end}}`

输出(在Go Playground上尝试):
[even:true] key=a; value=A
[even:false] key=b; value=B
[even:true] key=c; value=C
[even:false] key=d; value=D

如果您想为奇数和偶数迭代提供不同的输出,则可以在$e操作中调用{{if}},如下所示:
const templ = `{{$e := isEven}}
{{- range $k, $v := . -}}
    [{{if call $e}}even{{else}}odd {{end}}] key={{$k}}; value={{$v}}
{{end}}`

输出(在Go Playground上尝试):
[even] key=a; value=A
[odd ] key=b; value=B
[even] key=c; value=C
[odd ] key=d; value=D

引擎盖下

此模板操作:
{{$e := isEven}}

创建一个名为$e的新模板变量,其值将是isEven()函数调用的结果(返回值)。 isEven()返回一个函数值,该闭包可以访问类型为e的局部变量bool。稍后当您执行{{call $e}}时,您不会调用isEven() Go函数,而是调用了它返回的函数(闭包)并存储在$e中。该闭包引用了本地bool变量e,直到可访问isEvent()返回的函数,它才“释放”。

因此,每当您执行{{call $e}}时,它都会调用闭包,该闭包“具有” e类型的bool变量,其值在此$e的调用之间保留。

如果您要再次在模板中调用isEvent,则将返回一个新函数(闭包),包装一个局部变量e的新实例,该实例独立于第一个isEvent()调用返回的闭包的第一个包装变量。

关于dictionary - 迭代Go map 获取索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60090742/

相关文章:

python - 有效地在字典列表中查找值

python - 对于列表的列表,将字典与 collections.defaultdict 合并

go - 如何将 HttpRouter 与 MuxChain 一起使用?

json - 在字符串中插入一个变量

file - 如何获取文件的当前位置

if-statement - If - Else 条件

http - 重定向对静态文件的请求

c++ - 哪种数据结构用于 C++ 中巨大但不变的字典

Python map v2.7 在 v3.2 中不再工作

javascript - 在 Javascript 中引用 Go 数组