迭代Go map get index

时间:2017-03-22 10:12:43

标签: dictionary go go-templates revel

为了在模板中使用revel' even关键字,我希望在使用range进行迭代时获取地图条目的索引。有没有办法这样做? 我的地图有结构:

map[string][]string

4 个答案:

答案 0 :(得分:3)

您只能通过模板操作执行此操作,但您可以注册一个提供必要帮助的功能。

你可以注册一个函数,它返回一个函数(闭包),它在调用时交替返回它的值(确切地说"奇数""偶数"索引交替):

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()调用返回的闭包。

答案 1 :(得分:0)

{{range $key, $element := .Map}}
  {{$index := index .Map $key}}
{{end}}

答案 2 :(得分:0)

地图条目在Go中没有索引;你无法从任何元素中获得索引。此外,每次使用year迭代地图时,您都会获得不同的顺序 - 另一个暗示地图中没有索引概念。

索引仅与有序数据结构相关(例如,数组,切片,列表等),而不是映射。有关详细信息,请查看https://blog.golang.org/go-maps-in-action

答案 3 :(得分:0)

在循环遍历地图时实现索引的简单方法:

package main

import (
    "fmt"
)

func main() {
    mm := map[string]int{"xx" : 1, "gg" : 2}
    cnt := 0
    for a, b:= range mm{
        fmt.Println("a", a, "b",b, "c" , cnt)
        cnt++
    }
    fmt.Println("Hello, playground")
}

并打印:

a xx b 1 c 0
a gg b 2 c 1
Hello, playground