ホームページ > バックエンド開発 > Golang > Golang HTML テンプレートで変数スコープはどのように機能しますか?

Golang HTML テンプレートで変数スコープはどのように機能しますか?

Susan Sarandon
リリース: 2024-11-20 04:27:02
オリジナル
599 人が閲覧しました

How Does Variable Scope Work in Golang HTML Templates?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート