4

実行すると、データをテンプレートに送信して情報を置き換えるためにExecuteTemplate使用するすべての例が表示されます。&whateversruct{Title: "title info", Body: "body info"}私が持っているすべてのハンドラー関数が同じタイトル、ボディを持つことはないので、ハンドラー関数の外に構造体を作成する必要がないかどうか疑問に思っていました。テンプレート情報を置き換えるマップを送信できると便利です。考えやアイデアはありますか?

現在 - 大まかに書かれています

type Info struct {
    Title string
    Body string
}

func View(w http.ResponseWriter) {
    temp.ExecuteTemplate(w, temp.Name(), &Info{Title: "title", Body: "body"})
}

構造体を作成する必要はないようです。また、構造体は、作成する関数ごとに同じではありません。したがって、関数ごとに構造体を作成する必要があります(私が知っている)。

4

4 に答える 4

15

ケビンの答えを補強するには:匿名構造体はほとんど同じ動作をもたらします:

func View(w http.ResponseWriter) {
    data := struct {
        Title string
        Body  string
    } {
        "About page",
        "Body info",
    }

    temp.ExecuteTemplate(w, temp.Name(), &data)
}
于 2012-09-18T23:33:08.177 に答える
10

その構造体は単なる例です。構造体を外部から渡すことも、提案どおりにマップを使用することもできます。構造体のタイプは、テンプレートが期待するフィールドを文書化できるため、構造体は優れていますが、必須ではありません。

これらはすべて機能するはずです。

func View(w http.ResponseWriter, info Info) {
    temp.ExecuteTemplate(w, temp.Name(), &info)
}

func View(w http.ResponseWriter, info *Info) {
    temp.ExecuteTemplate(w, temp.Name(), info)
}

func View(w http.ResponseWriter, info map[string]interface{}) {
    temp.ExecuteTemplate(w, temp.Name(), info)
}
于 2012-09-18T20:33:24.367 に答える
6

テンプレートを構造体に適用する場合とマップに適用する場合の重要な違い: マップを使用すると、マップに存在しないテンプレートで参照を作成できます。テンプレートはエラーなしで実行され、参照は空になります。構造体に対して処理を行い、構造体に存在しないものを参照すると、テンプレートの実行でエラーが返されます。

マップに存在しないアイテムを参照すると便利な場合があります。次のサンプル Web アプリの menu.html と、views.go の getPage() 関数について考えてみましょう: https://bitbucket.org/jzs/sketchground/src。メニューにマップを使用することで、アクティブなメニュー項目が簡単に強調表示されます。

この違いを簡単に説明すると、次のようになります。

package main

import (
    "fmt"
    "html/template"
    "os"
)

type Inventory struct {
    Material string
    Count    uint
}

func main() {
    // prep the template
    tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}} - {{.Foo}}\n")
    if err != nil {
        panic(err)
    }

    // map first
    sweaterMap := map[string]string{"Count": "17", "Material": "wool"}
    err = tmpl.Execute(os.Stdout, sweaterMap)
    if err != nil {
        fmt.Println("Error!")
        fmt.Println(err)
    }

    // struct second
    sweaters := Inventory{"wool", 17}
    err = tmpl.Execute(os.Stdout, sweaters)
    if err != nil {
        fmt.Println("Error!")
        fmt.Println(err)
    }
}
于 2013-10-08T06:10:00.267 に答える
1

あなたは完全に正しいケビンです!!! 私はこれが完全に好きです。ありがとう!!!

func View(w http.ResponseWriter) {
    info := make(map[string]string)
    info["Title"] = "About Page"
    info["Body"] = "Body Info"
    temp.ExecuteTemplate(w, temp.Name(), info)
}
于 2012-09-18T20:46:57.847 に答える