我试图打印地图的值,其中的键上有一个点(.
)。
示例地图:
type TemplateData struct {
Data map[string] int
}
tpldata := TemplateData{map[string]int {"core.value": 1}}
我试过了:
{{ $key := "core.value" }}
{{ .Data.key }}
但得到了:
2014/06/17 16:46:17 http: panic serving [::1]:41395: template: template.html:13: bad character U+0024 '$'
和
{{ .Data."core.value" }}
但得到了:
2014/06/17 16:45:07 http: panic serving [::1]:41393: template: template.html:12: bad character U+0022 '"'
请注意,我能够成功打印没有点的键值。
答案 0 :(得分:18)
正如@ martin-ghallager所说,人们需要使用外部函数来访问这些元素。
希望标准库已经提供了函数index
(http://golang.org/pkg/text/template/#hdr-Functions),它将完全执行Martin dotNotation
函数的功能。
使用它只需写:
{{ index .Data "core.value" }}
如果密钥不存在,index
函数将返回默认值。如果您的字典具有同类数据,则此方法有效,但是当它是异构数据时,它将返回错误的值。在这种情况下,您可以使用以下命令显式设置默认值:
{{ 0 | or (index .Data "core.value") }}
答案 1 :(得分:5)
正如fabrizioM所说的那样,它违背了软件包的规格,但是没有什么能阻止你创建自己的访问器来使用功能映射使用点符号:
package main
import (
"fmt"
"html/template"
"os"
)
type TemplateData struct {
Data map[string]int
}
var funcMap = template.FuncMap{
"dotNotation": dotNotation,
}
func main() {
data := TemplateData{map[string]int{"core.value": 1, "test": 100}}
t, err := template.New("foo").Funcs(funcMap).Parse(`{{dotNotation .Data "core.value"}}`)
if err != nil {
fmt.Println(err)
}
err = t.Execute(os.Stdout, data)
if err != nil {
fmt.Println(err)
}
}
func dotNotation(m map[string]int, key string) int {
// Obviously you'll need to validate existence / nil map
return m[key]
}
答案 2 :(得分:2)
不,你不能。 根据{{3}}中的规范,键必须是字母数字
- The name of a key of the data, which must be a map, preceded
by a period, such as
.Key
The result is the map element value indexed by the key.
Key invocations may be chained and combined with fields to any
depth:
.Field1.Key1.Field2.Key2
Although the key must be an alphanumeric identifier, unlike with
field names they do not need to start with an upper case letter.
Keys can also be evaluated on variables, including chaining:
$x.key1.key2
您仍然可以通过迭代Map来打印它 包主要
import (
"fmt"
"html/template"
"os"
)
type TemplateData struct {
Data map[string]int
}
func main() {
data := TemplateData{map[string]int{"core.value": 1, "test": 100}}
t, err := template.New("foo").Parse(`{{range $key, $value := .Data}}
{{$key}}: {{$value}}
{{end}}`)
if err != nil {
fmt.Println(err)
}
err = t.Execute(os.Stdout, data)
if err != nil {
fmt.Println(err)
}
}
答案 3 :(得分:-1)
我遇到了类似的问题,例如,我的秘密保险库中的密钥名称中包含-
和.
test-key
或test.key
如果这样解决了
{{ with secret "secret/path/test"}}
{{ range $k, $v := .Data }}
{{ $k }}:{{ $v }}
{{ end }}
{{ end }}
希望这会帮助某人...