2017-06-13 38 views
2

我想創建一個如果不提供的參數使用默認值的golang模板,但如果我嘗試使用or功能在我的模板,它給了我這個錯誤:如何將默認值添加到去文本/模板?

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)) 
} 

谷歌搜索指出我朝着isset功能hugo's template engine,但我想不出他們是如何實現它,我不知道如果它甚至會解決我的問題。

回答

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

相關問題