golang-如何在模板中分割字符串

I try to use template.FuncMap but there are panic error

panic: runtime error: invalid memory address or nil pointer dereference

code:

type Article struct{
    Id int
    Title string
    Tags  string
}

var (
    tplFuncMap template.FuncMap 
)

func main() {
    article := &Article{Id:1, Title:"hello world", Tags:"golang,javascript"}
    tplFuncMap =  make(template.FuncMap)
    tplFuncMap["Split"] = Split
    tpl, _ := template.ParseFiles("a.html", "b.html")
    tpl = tpl.Funcs(tplFuncMap)
    tpl.Execute(os.Stdout, article)
}

func Split(s string, d string) []string {
    arr := strings.Split(s, d)
    return arr
}

a.html

//i want to split tags and range
{{$arr := Split .Tags ","}}
{{range $k, $v := $arr}}
    <a href="{{$v}}">{{$v}}</a>
{{end}}

Thanks.

1个回答



您正在忽略 template.ParseFiles </ code>返回的错误,这很可能会告诉您您的问题。 ParseFiles可能会引发错误,因为解析模板时未定义函数 Split </ code>。 永远不要忽略错误。</ p>

编辑</ strong> </ p>

要使其正常运行,请执行以下操作:</ p>

  tplFuncMap = make(template.FuncMap)
tplFuncMap [“ Split”] =拆分
tmpl,err = template.New(“”)。Funcs(tplFuncMap).ParseFiles(“ a.html” ,“ b.html”)
</ code> </ pre>

区别在于 FuncMap </ code>是在解析模板之前定义的。</ p> \ n </ div>

展开原文

原文

You are ignoring the error returned by template.ParseFiles, that will probably tell you your problem. ParseFiles is probably throwing an error because the function Split isn't defined when you parse the template. Never ignore errors.

Edit

To make it work, do something like this:

tplFuncMap =  make(template.FuncMap)  
tplFuncMap["Split"] = Split  
tmpl, err = template.New("").Funcs(tplFuncMap).ParseFiles("a.html", "b.html")

The difference is that the FuncMap is defined before the templates are parsed.

doumengjing1500
doumengjing1500 当您删除模板中的Split函数时,它起作用的原因是因为解析器不再找到未定义的Func。 正如nemo所提到的,我本来可以更加清楚。 我在更新一个例子。
6 年多之前 回复
dongliuzhuan1219
dongliuzhuan1219 Egeto,在真实代码中我有输出错误。 我确定“ a.html”拆分功能中有问题,因为如果我注释代码,它将很好地工作。
6 年多之前 回复
dongyao8698
dongyao8698 您错过了重要的一点(错误的原因):在tpl上访问Funcs为nil。
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐