場景
有時候需要使用go的模板語法,比如說用go 去渲染html頁面的時候,再比如說用go的模板搞代碼生成的時候。這時候可能會遇到一個麻煩,不想轉譯的特殊字符被轉譯了。
我遇到的情況是寫代碼生成器的時候,‘<’ 符號被轉譯了,導致channel 相關的部分有問題。
這個問題很簡單,但是資料不多,我也是試了半天才發現。其實把包含特殊字符的字符串 先轉成 template.HTML 類型再加載到文件里 就可以了。
解決
先看代碼
t := template.New("initMysql")
type NsqConsumerTpl struct {
Names []string
AngleBracket template.HTML
}
v := NsqConsumerTpl{
Names: nsqConsumerIns,
AngleBracket:template.HTML("<")
}
這里首先聲明了一個模板,然后聲明一個結構體,用於在模板里的渲染。 其AngleBracket 字段即為一個 在模板里 不被轉譯的特殊字符字段。這里我用來放‘<’了.
下面的這段代碼,聲明一段模板,然后模板內直接引用 這個字段即可,此時 ‘<’ 不會被轉譯。
tpl := `func (p *NsqConsumerMgr) Start() error {
{{range .Names}}
err := p.{{.}}.ConnectToNSQLookupds(p.{{.}}.LookupAddr)
if err != nil {
panic(err)
}
{{end}}
ch := make(chan bool)
{{ .AngleBracket }}-ch
return nil
}`
t.Execute(tpl, v)
如果不只一個地方使用的話,可以提出來一個函數
定義函數,函數內容很簡單,把str轉成temp.HTML類型。
func unescaped (str string) template.HTML { return template.HTML(str) }
把函數注冊到模板:
t = t.Funcs(template.FuncMap{"unescaped": unescaped})
這時候,用於渲染的結構體,特殊字符也可以直接用string
type NsqConsumerTpl struct {
Names []string
AngleBracket string
}
模板內使用稍有不同,{{ .AngleBracket | unescaped}} 這一句的意思是: 通過 通道(類似linux 通道的概念)把AngleBracket 作為參數,傳給unescaped 函數。
func (p *NsqConsumerMgr) Start() error {
{{range .Names}}
err := p.{{.}}.ConnectToNSQLookupds(p.{{.}}.LookupAddr)
if err != nil {
panic(err)
}
{{end}}
ch := make(chan bool)
{{ .AngleBracket | unescaped}}-ch
return nil
}
t.Execute(tpl, v)
說起來比較簡單,但是資料很少,查起來比較費勁,於是總結與此,分享一下。
歡迎補充
有收獲記得點贊哦~