【发布时间】:2023-03-07 09:58:01
【问题描述】:
我有一个结构,它有一个 url.URL value 作为它的(许多)字段之一。我正在尝试将该结构的实例传递给html/template,并让它以合理的方式呈现这些字段,包括 URL。
考虑这个示例代码:
package main
import (
"html/template"
"net/url"
"os"
)
var tmpl *template.Template = template.Must(
template.New("").Parse(`<a href="{{ .URL }}">{{ .Text }}</a>` + "\n"),
)
type pointer struct {
Text string
URL *url.URL // pointer, which is rendered sensibly
}
type value struct {
Text string
URL url.URL // value, which is not rendered sensibly
}
func main() {
u := url.URL{Scheme: "https", Host: "google.com", Path: "/path"}
pointer := pointer{Text: "pointer", URL: &u}
value := value{Text: "value", URL: u}
tmpl.Execute(os.Stdout, pointer)
tmpl.Execute(os.Stdout, value)
}
在我的机器上(去 1.9.1),这个输出:
<a href="https://google.com/path">pointer</a>
<a href="%7bhttps%20%20%3cnil%3e%20google.com%20/path%20%20false%20%20%7d">value</a>
在the playground 上,输出:
<a href="https://google.com/path">pointer</a>
<a href="
** Signal 11 from untrusted code: pc=630b0008b020
Program exited.
让html/template 呈现“通常”传递结构的字段url.URL 值的最佳方式是什么?
(理想情况下,我只更改模板,或者可能在FuncMap 中使用某些东西。理想情况下,我还希望避免创建一堆几乎相同的结构,这些结构具有*url.URLs 而不是url.URLs,或者必须用结构的字段填充映射并将 that 传递给模板。)
【问题讨论】:
-
play.golang.org/p/PtPNvQV9vNc 如果你想要一个函数同时用于两个函数,让它接受一个接口,然后输入 assert。
-
net.URL的每个方法和构造函数都使用指针。为什么要使用值? -
@Adrian:这些结构由数据库支持,所以看起来很合理,但你说得很好。
标签: go