Go中的模板与其他语言(例如PHP)中的模板不同。使用template.FuncMap为您的模板创建自定义功能。
package mainimport ( '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}
或者,尝试使用游乐场版本。
解决方法如何在不返回值的模板中执行功能?这是示例:
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中看到此代码
我知道模板中的逻辑不应该太多,但是对无返回值的运行函数的无知对我来说似乎是一个有趣的问题。