如何打印包含点的键的值

Seb*_*eft 17 templates go

我正在尝试打印地图的值,其键上有一个点(.).

示例地图:

type TemplateData struct {
    Data map[string] int
}
tpldata := TemplateData{map[string]int {"core.value": 1}}
Run Code Online (Sandbox Code Playgroud)

我试过了:

{{ $key := "core.value" }}
{{ .Data.key }}
Run Code Online (Sandbox Code Playgroud)

但得到了:

2014/06/17 16:46:17 http: panic serving [::1]:41395: template: template.html:13: bad character U+0024 '$'
Run Code Online (Sandbox Code Playgroud)

{{ .Data."core.value" }}
Run Code Online (Sandbox Code Playgroud)

但得到了:

2014/06/17 16:45:07 http: panic serving [::1]:41393: template: template.html:12: bad character U+0022 '"'
Run Code Online (Sandbox Code Playgroud)

请注意,我能够成功打印没有点的键值.

Seb*_*eft 25

正如@ martin-ghallager所说,人们需要使用外部函数来访问这些元素.

希望标准库已经提供了函数dotNotation(http://golang.org/pkg/text/template/#hdr-Functions),它将完成Martin的index功能.

要使用它只需写:

{{ index .Data "core.value" }}
Run Code Online (Sandbox Code Playgroud)

dotNotation如果密钥不存在,该函数将返回默认值.如果您的字典具有同类数据,则此方法有效,但是当它是异构数据时,它将返回错误的值.在这种情况下,您可以使用以下方式显式设置默认值:

{{ 0 | or (index .Data "core.value") }}
Run Code Online (Sandbox Code Playgroud)


Mar*_*her 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]
}
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/-rlKFx3Ayt

  • 这个答案指出了我正确的方向.模板包已经提供了索引功能,就像你的dotNotation一样. (3认同)