Réponse à une question similaire ici , mais je ne pense pas que cela résout mon problème.
Disons que vous avez la structure suivante:
type User struct {
Username string
Password []byte
Email string
...
}
De plus, l'URL a une structure comme celle-ci: example.com/en/users
, où "en"
est un paramètre d'URL qui sera passé dans le modèle comme ceci:
renderer.HTML(w, http.StatusOK, "users/index", map[string]interface{}{
"lang": chi.URLParam(r, "lang"),
"users": users})
Et dans le modèle HTML, j'ai les éléments suivants:
{{ range .users }}
<form action="/{{ .lang }}/users" method="POST">
<input type="text" name="Username" value="{{ .Username }}">
<input type="text" name="Email" value="{{ .Email }}">
</form>
{{ end }}
Maintenant, le problème est que parce que {{ .lang }}
ne fait pas partie de la structure User
alors j'obtiens l'erreur .. alors comment puis-je accéder à {{ .lang }}
à l'intérieur {{ range .users }}
?
Le contenu du point (.
) sont affectés à $
après invocation de range
, vous pouvez donc utiliser $
pour accéder à lang
( en lecture ):
{{ range .users }}
<form action="/{{ $.lang }}/users" method="POST">
<input type="text" name="Username" value="{{ .Username }}">
<input type="text" name="Email" value="{{ .Email }}">
</form>
{{ end }}
Le comportement est documenté ici :
Lorsque l'exécution commence,
$
est défini sur l'argument de données passé àExecute
, c'est-à-dire à la valeur de départ de dot.
Si vous utilisez des plages imbriquées, vous pouvez toujours recourir à l'affectation d'un point à autre chose à l'aide de l'instruction with
ou des instructions d'affectation de variable. Voir l'autre réponse pour cela.
Vous pouvez utiliser une variable pour .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 }}
Voir ici à la documentation: https://golang.org/pkg/text/template/#hdr-Variables