如何在不返回值的模板中执行功能?这是示例:
func main() { u, err := url.Parse("http://example.com/test?param1=true¶m2=true") if err != nil { log.Fatal(err) } m := u.Query() m.Del("param1") // param1 successful deleted! u.RawQuery = m.Encode() fmt.Println(u.RawQuery) const tmpl = ` {{$m := .Query}} {{$m.Del "param2"}} <!-- failed to delete param2! --> {{.RawQuery}} ` t := template.Must(template.New("").Parse(tmpl)) err = t.Execute(os.Stdout, u) if err != nil { log.Println("executing template:", err) } }
在play.golang.org中看到此代码
我知道模板中的逻辑不应该太多,但是对无返回值的运行函数的无知对我来说似乎是一个有趣的问题。
Go中的模板与其他语言(例如PHP)中的模板不同。使用template.FuncMap为您的模板创建自定义功能。
template.FuncMap
package main import ( "fmt" "log" "net/url" "os" "text/template" ) func main() { funcMap := template.FuncMap{ "delete": deleteMap, } u, err := url.Parse("http://example.com/test?param1=true¶m2=true") if err != nil { log.Fatal(err) } u = deleteMap(u, "param1") // works in regular code and templates fmt.Println(u.RawQuery) const tmpl = ` {{$m := delete . "param2"}} <!-- WORKS! --> {{$m.RawQuery}} ` t := template.New("").Funcs(funcMap) t = template.Must(t.Parse(tmpl)) err = t.Execute(os.Stdout, u) if err != nil { log.Println("executing template:", err) } } func deleteMap(u *url.URL, key string) *url.URL { m := u.Query() m.Del(key) // key successful deleted! u.RawQuery = m.Encode() return u }
或者,尝试使用游乐场版本。