无法调用返回0个结果的方法/函数。

huangapple go评论73阅读模式
英文:

Text/template: "can't call method/function with 0 results."

问题

如何在模板中执行不返回值的函数?以下是示例代码:

func main() {
    u, err := url.Parse("http://example.com/test?param1=true&param2=true")
    if err != nil {
        log.Fatal(err)
    }
    m := u.Query()
    m.Del("param1") // param1成功删除!
    u.RawQuery = m.Encode()
    fmt.Println(u.RawQuery)

    const tmpl = `
    {{$m := .Query}}
    {{$m.Del "param2"}} <!-- 无法删除param2! -->
    {{.RawQuery}}
    `
    t := template.Must(template.New("").Parse(tmpl))
    err = t.Execute(os.Stdout, u)
    if err != nil {
        log.Println("executing template:", err)
    }
}

我知道模板中不应该有太多逻辑,但是对于无法返回值的函数的运行方式的无知对我来说是一个有趣的问题。

英文:

How can I execute function in templates that returns no value? Here is example:

func main() {
	u, err := url.Parse(&quot;http://example.com/test?param1=true&amp;param2=true&quot;)
	if err != nil {
		log.Fatal(err)
	}
	m := u.Query()
	m.Del(&quot;param1&quot;) // param1 successful deleted!
	u.RawQuery = m.Encode()
	fmt.Println(u.RawQuery)

	const tmpl = `
	{{$m := .Query}}
	{{$m.Del &quot;param2&quot;}} &lt;!-- failed to delete param2! --&gt;
	{{.RawQuery}}
	`
	t := template.Must(template.New(&quot;&quot;).Parse(tmpl))
	err = t.Execute(os.Stdout, u)
	if err != nil {
		log.Println(&quot;executing template:&quot;, err)
	}

}

<iframe src="http://play.golang.org/p/tJbaKZbOkt" frameborder="0" style="width: 100%; height: 100%"><a href="http://play.golang.org/p/tJbaKZbOkt">see this code in play.golang.org</a></iframe>
<br>
I know that in templates shouldn't be much logic, but ignorance of running function that returns no value seems to me interesting issue.

答案1

得分: 1

在Go语言中,模板与其他语言(如PHP)中的模板不同。可以使用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&param2=true")
	if err != nil {
		log.Fatal(err)
	}

	u = deleteMap(u, "param1") // 在常规代码和模板中都可以使用

	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) // 成功删除键!
	u.RawQuery = m.Encode()
	return u
}

或者,可以尝试playground版本

英文:

Templates in Go are not like those in other languages (e.g. PHP). Use template.FuncMap to create custom functions for your templates.

package main

import (
	&quot;fmt&quot;
	&quot;log&quot;
	&quot;net/url&quot;
	&quot;os&quot;
	&quot;text/template&quot;
)

func main() {
	funcMap := template.FuncMap{
		&quot;delete&quot;: deleteMap,
	}

	u, err := url.Parse(&quot;http://example.com/test?param1=true&amp;param2=true&quot;)
	if err != nil {
		log.Fatal(err)
	}

	u = deleteMap(u, &quot;param1&quot;) // works in regular code and templates

	fmt.Println(u.RawQuery)

	const tmpl = `
	{{$m := delete . &quot;param2&quot;}} &lt;!-- WORKS! --&gt;
	{{$m.RawQuery}}
	`
	t := template.New(&quot;&quot;).Funcs(funcMap)
	t = template.Must(t.Parse(tmpl))

	err = t.Execute(os.Stdout, u)

	if err != nil {
		log.Println(&quot;executing template:&quot;, 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
}

Or, try the playground version.

huangapple
  • 本文由 发表于 2015年7月4日 22:39:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/31221849.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定