在Golang模板中向地图添加新的键值

时间:2019-07-12 01:58:09

标签: go go-templates

$ hugo version
Hugo Static Site Generator v0.54.0 darwin/amd64 BuildDate: unknown
$ cat layouts/t/code.html
  ...
  {{- $json := getJSON $path -}}
  {{- if eq $action "edit" -}}
    {{- $json.nestedMap["action"] = "update" -}}
  {{- end -}}
  ...
  <script type="module">
    import App from "/code.js";
    new App({{ $json.nestedMap | jsonify }});
  </script>
  

$ json.nestedMap是map [string] interface {}

但是错误解析失败,错误字符U + 005B‘[’

感谢任何提示。

2 个答案:

答案 0 :(得分:2)

您遇到的错误是因为[字符是意外字符。

实际上,此语法在模板内不起作用:

$json.nestedMap["action"]

您必须改为使用index函数来访问地图元素:

index $json.nestedMap "action"

但是,根据AFAIK的语法,您实际上不能设置密钥,而只能访问它。

一种修改模板内部映射的方法是在包装器结构中定义一些方法,然后从模板中调用该方法。

例如:

type mapWrapper struct {
    TheMap map[string]interface{}
}

func (m *mapWrapper) SetMapValue(key, value string) string {
    m.TheMap[key] = value
    return ""
}

然后在模板中:

{{- .SetMapValue "key2" "value2" }}

在操场上的完整工作示例:

https://play.golang.org/p/8bT4jjYwuzg

答案 1 :(得分:0)

正如@eugenioy所说,没有内置的方法可以执行此操作,因此您需要使用一个函数。

幸运的是,有一个广泛的常用模板函数库,称为Sprig,它提供了:http://masterminds.github.io/sprig/dicts.html