迭代 Go map 获取索引
Iterate Go map get index
为了在模板中使用 revel
的 even
关键字,我想在使用 range
迭代时获取地图条目的索引。有什么办法吗?
我的地图具有以下结构:
map[string][]string
{{range $key, $element := .Map}}
{{$index := index .Map $key}}
{{end}}
您不能仅使用模板操作来执行此操作,但您可以注册一个提供必要帮助的函数。
您可以注册一个函数,该函数 return 是一个函数(闭包),它会在调用时交替其 return 值(确切地说 "odd" 和 "even" 索引如何交替) :
func isEven() func() bool {
e := false
return func() bool {
e = !e
return e
}
}
为了不和拉威尔的even()
冲突,所以取名isEven()
。使用它:
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
如果您想要奇数和偶数迭代的不同输出,您可以在 {{if}}
操作中调用 $e
,如下所示:
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()
函数调用的结果(return 值)。 isEven()
return 是一个函数值,一个可以访问 bool
类型的局部变量 e
的闭包。稍后您执行 {{call $e}}
时,您并不是在调用 isEven()
Go 函数,而是调用它 returned(闭包)并存储在 $e
中的函数。该闭包引用了局部 bool
变量 e
,它不是 "freed",直到 isEvent()
编辑的函数 return 可访问。
因此,无论何时您执行 {{call $e}}
,它都会调用闭包,该闭包 "has" 一个 e
类型 bool
的变量,其值在调用此 $e
.
如果您再次在模板中调用 isEvent
,那将 return 一个新函数(闭包),包装局部变量 e
的一个新实例,独立于闭包的第一个包装变量 return 由第一个 isEvent()
调用编辑。
Map条目在Go中没有索引;您无法从任何元素中获取索引。此外,每次使用 range
在地图上进行迭代时,您都会得到不同的顺序 - 另一个暗示地图中没有索引概念。
索引仅与有序数据结构(例如数组、切片、列表等)相关,与映射无关。查看 https://blog.golang.org/go-maps-in-action 了解更多详情。
循环遍历地图时实现索引的简单方法:
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
为了在模板中使用 revel
的 even
关键字,我想在使用 range
迭代时获取地图条目的索引。有什么办法吗?
我的地图具有以下结构:
map[string][]string
{{range $key, $element := .Map}}
{{$index := index .Map $key}}
{{end}}
您不能仅使用模板操作来执行此操作,但您可以注册一个提供必要帮助的函数。
您可以注册一个函数,该函数 return 是一个函数(闭包),它会在调用时交替其 return 值(确切地说 "odd" 和 "even" 索引如何交替) :
func isEven() func() bool {
e := false
return func() bool {
e = !e
return e
}
}
为了不和拉威尔的even()
冲突,所以取名isEven()
。使用它:
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
如果您想要奇数和偶数迭代的不同输出,您可以在 {{if}}
操作中调用 $e
,如下所示:
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()
函数调用的结果(return 值)。 isEven()
return 是一个函数值,一个可以访问 bool
类型的局部变量 e
的闭包。稍后您执行 {{call $e}}
时,您并不是在调用 isEven()
Go 函数,而是调用它 returned(闭包)并存储在 $e
中的函数。该闭包引用了局部 bool
变量 e
,它不是 "freed",直到 isEvent()
编辑的函数 return 可访问。
因此,无论何时您执行 {{call $e}}
,它都会调用闭包,该闭包 "has" 一个 e
类型 bool
的变量,其值在调用此 $e
.
如果您再次在模板中调用 isEvent
,那将 return 一个新函数(闭包),包装局部变量 e
的一个新实例,独立于闭包的第一个包装变量 return 由第一个 isEvent()
调用编辑。
Map条目在Go中没有索引;您无法从任何元素中获取索引。此外,每次使用 range
在地图上进行迭代时,您都会得到不同的顺序 - 另一个暗示地图中没有索引概念。
索引仅与有序数据结构(例如数组、切片、列表等)相关,与映射无关。查看 https://blog.golang.org/go-maps-in-action 了解更多详情。
循环遍历地图时实现索引的简单方法:
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