Golang HTML テンプレートの変数のスコープ制限
Golang の HTML テンプレートでは、変数は := 演算子を使用して導入され、スコープが制限されていますテンプレート内で。その結果、条件ブロック内の変数への変更には、条件ブロックの外部からアクセスできなくなります。これは、シンプルさを強調し、複雑なロジックを避ける Go のテンプレートの設計哲学によって説明できます。
変数スコープの制限
テキスト/テンプレート パッケージに記載されているとおりdocument:
「変数のスコープは、変数が宣言されている制御構造の 'end' アクション ('if'、'with'、または 'range')、またはテンプレートの最後まで拡張されます。そのような制御構造がない場合。"
変数スコープ制約の例
次のテンプレート コードを考えてみましょう。
{{if .UserData}} {{$currentUserId := .UserData.UserId}} [<a href="#ask_question">Inside {{$currentUserId}}</a>] {{else}} {{$currentUserId := 0}} {{end}} [<a href="#ask_question">outside {{$currentUserId}}</a>]
内 { {if}} ブロックでは、新しい変数 {{$currentUserId}} が導入され、既存の変数をシャドウします。そのスコープはブロックに制限されており、条件境界の外ではブロックにアクセスできなくなります。
考えられる回避策
1.変数アクセス用のカスタム関数:
効果的なアプローチは、UserData が存在する場合はユーザー ID を返し、存在しない場合は 0 を返すカスタム関数 "CurrentUserId()" を作成することです。この関数はテンプレートに登録できます。 Funcs() メソッドを使用します。
func main() { m := map[string]interface{}{} t := template.Must(template.New("").Funcs(template.FuncMap{ "CurrentUserId": func() int { if u, ok := m["UserData"]; ok { return u.(UserData).UserId } return 0 }, }).Parse(src)) }
2.シミュレートされた変更可能な変数:
カスタム関数も変更可能な変数をシミュレートできます。テンプレート データとして渡されたマップに格納されている値を変更する「SetCurrentUserId()」を検討してください。
func main() { m := map[string]interface{}{} t := template.Must(template.New("").Funcs(template.FuncMap{ "SetCurrentUserId": func(id int) string { m["CurrentUserId"] = id return "" }, }).Parse(src)) }
これらの回避策を利用すると、Golang HTML テンプレートの変数スコープの制限を克服でき、柔軟性が向上します。変数の使用法。
以上がGolang HTML テンプレートで変数スコープはどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。