Go模板:无法评估Y类型中的字段X(X不是Y的一部分,但卡在{{range}}循环中)

fis*_*ker 13 go go-templates

类似的问题在这里得到了回答,但我不认为它解决了我的问题.

假设你有以下结构:

type User struct {
    Username string
    Password []byte
    Email string
    ...
}
Run Code Online (Sandbox Code Playgroud)

此外,URL的结构如下:example.com/en/users,其中"en"是一个URL参数,将被传递到模板中,如下所示:

renderer.HTML(w, http.StatusOK, "users/index", map[string]interface{}{
  "lang":  chi.URLParam(r, "lang"),
  "users": users})
Run Code Online (Sandbox Code Playgroud)

在HTML模板中,我有以下内容:

{{ range .users }}
  <form action="/{{ .lang }}/users" method="POST">
    <input type="text" name="Username" value="{{ .Username }}">
    <input type="text" name="Email" value="{{ .Email }}">
  </form>
{{ end }}
Run Code Online (Sandbox Code Playgroud)

现在,问题是因为{{.lang}}不是User结构的一部分,所以我得到了错误..那么如何在{{range .users}}中访问{{.lang}}?

nem*_*emo 23

dot(.)的内容$在调用后分配给range,因此您可以$用来访问lang(正在播放):

{{ range .users }}
  <form action="/{{ $.lang }}/users" method="POST">
    <input type="text" name="Username" value="{{ .Username }}">
    <input type="text" name="Email" value="{{ .Email }}">
  </form>
{{ end }}
Run Code Online (Sandbox Code Playgroud)

这里记录这种行为:

执行开始时,$设置为传递给的数据参数Execute,即dot的起始值.

如果使用嵌套范围,则始终可以使用with语句或变量赋值语句回退以将点分配给其他内容.请参阅其他答案.


apx*_*pxp 8

您可以使用变量 .lang

{{ $lang := .lang }}
{{ range .users }}
  <form action="/{{ $lang }}/users" method="POST">
    <input type="text" name="Username" value="{{ .Username }}">
    <input type="text" name="Email" value="{{ .Email }}">
  </form>
{{ end }}
Run Code Online (Sandbox Code Playgroud)

请参阅文档:https://golang.org/pkg/text/template/#hdr-Variables