golang 模板語法使不解析html標簽及特殊字符


場景

有時候需要使用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)

說起來比較簡單,但是資料很少,查起來比較費勁,於是總結與此,分享一下。
歡迎補充

有收獲記得點贊哦~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM