2017-03-20 3 views
2

、あなたはこのようにフィールドを取得できます。現在の年をGoテンプレートにどのように追加しますか?囲碁テンプレートで

template.Parse("<html><body>{{ .Title }}</body></html>") 
template.Execute(w, myObject) 

どのように「インライン」現在のUTC年でしょうか?私はこのような何かやりたい:

template.Parse("<html><body>The current year is {{time.Time.Now().UTC().Year()}}</body></html>") 

をしかし、それはエラーを返します:

panic: template: function "time" not defined

+0

myYouオブジェクトにCurrentYearフィールドを追加し、テンプレートに{{.CurrentYear}}を使用すると、何が問題になりますか? –

答えて

3

テンプレートに機能を追加することができ、この試してください:あなたは既に含めている

package main 

import (
    "html/template" 
    "log" 
    "os" 
    "time" 
) 

func main() { 
    funcMap := template.FuncMap{ 
     "now": time.Now, 
    } 

    templateText := "<html><body>The current year is {{now.UTC.Year}}</body></html>" 
    tmpl, err := template.New("titleTest").Funcs(funcMap).Parse(templateText) 
    if err != nil { 
     log.Fatalf("parsing: %s", err) 
    } 

    // Run the template to verify the output. 
    err = tmpl.Execute(os.Stdout, nil) 
    if err != nil { 
     log.Fatalf("execution: %s", err) 
    } 
} 
1

をテンプレート内のTitleそれはどうやってテンプレートに終わるのですか? Template.Execute()の引数として渡します。これは(当然ながら)現在の年にも機能します。

これは、関数を登録するよりも優れた方法です。

t := template.Must(template.New("").Parse(
    "<html><body>{{ .Title }}; Year: {{.Year}}</body></html>")) 

myObject := struct { 
    Title string 
    Year int 
}{"Test Title", time.Now().UTC().Year()} 

if err := t.Execute(os.Stdout, myObject); err != nil { 
    fmt.Println(err) 
} 

出力(Go Playground上でそれを試してみてください):

<html><body>Test Title; Year: 2009</body></html> 

(注:これは、ように見えることができる方法であるゴー遊び場の現在の日付/時刻が2009-11-10 23:00:00で、あなたが見る理由です2009)。

テンプレートには、複合語論理が含まれてはいけません。テンプレートで何か(または見た目が)複雑すぎる場合は、Goコードで結果を計算し、その結果をデータに渡して実行するか、テンプレートにコールバック関数を登録し、その関数を呼び出して関数を呼び出して挿入する戻り値

今年はおそらく複雑な論理ではありません。しかし、Goは静的にリンクされた言語です。実行可能バイナリには、Go(ソース)コードが明示的に参照するパッケージと関数のみが含まれることが保証されています。これは標準ライブラリのすべてのパッケージに適用されます(runtimeパッケージを除く)。したがって、テンプレートテキストは、timeパッケージのようなパッケージから関数を参照して呼び出すことはできません。実行時に利用できるという保証はないからです。

関連する問題