2017-06-13 7 views
2

私はパラメータが供給されていない場合に使用されるデフォルト値でgolangテンプレートを作成したいが、私は私のテンプレートでor機能を使用しようとすると、それは私に、このエラーを与える:go text/templateにデフォルト値を追加するにはどうすればよいですか?

template: t2:2:20: executing "t2" at <index .table_name 0>: error calling index: index of untyped nil 

ここですコードの例:https://play.golang.org/p/BwlpROrhm6

// text/template is a useful text generating tool. 
// Related examples: http://golang.org/pkg/text/template/#pkg-examples 
package main 

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

var fullParams = map[string][]string{ 
    "table_name": []string{"TableNameFromParameters"}, 
    "min":  []string{"100"}, 
    "max":  []string{"500"}, 
} 
var minimalParams = map[string][]string{ 
    "min": []string{"100"}, 
    "max": []string{"500"}, 
} 

func check(err error) { 
    if err != nil { 
     fmt.Print(err) 
    } 
} 

func main() { 
    // Define Template 
    t := template.Must(template.New("t2").Parse(` 
     {{$table_name := (index .table_name 0) or "DefaultTableName"}} 
     Hello World! 
     The table name is {{$table_name}} 
    `)) 
    check(t.Execute(os.Stdout, fullParams)) 
    check(t.Execute(os.Stdout, minimalParams)) 
} 

グーグルはhugo's template engineisset機能の方に私を指摘しているが、私は、彼らはそれを実装する方法を見つけ出すことはできません、と私はそれも私の問題を解決するかどうかわかりません。

答えて

3

である:例えばのために

// Define Template 
t := template.Must(template.New("t2").Parse(` 
    Hello World! 
    The table name is {{with .table_name}}{{index . 0}}{{else}}DefaultTableName{{end}} 
`)) 

しかし、値は変数に格納されないため、別の場所で再利用したい場合は、再度書き込む必要があります。標準テンプレートパッケージの主な目的は、が事前計算された値をレンダリングすることであり、ロジック関連の演算/関数は機能が制限されています。ただし、独自のfunctionを定義して、テンプレートのFuncMapに登録することができます。 @ jeevatkmで述べたdefault関数。

+1

それは確かにきれいではありませんが、機能します!私はあなたが意図した目的について正しいと思う - おそらくテンプレートの外にデフォルトを渡すべきです。私は、このプロジェクトの将来の改訂について、それを念頭に置いています。 – Noah

1

Goテンプレートにはdefault機能がありません。しかし、default関数を提供するライブラリを使用することができます。 github.com/leekchan/gtf

ここで参照してください、それはhttps://github.com/leekchan/gtf/blob/master/gtf.go#L28


読むヒューゴで実装されているかisset FUNC hereとソースは別の解決策は、にテンプレート定義を変更することであるhere

関連する問題