2017-08-15 47 views
1

我在https://groups.google.com/forum/#!topic/golang-nuts/CUbdaHkESJk問了這個問題,但沒有收到答覆。如何從template.FuncMap返回HTML模板?

我正在寫一個Web based media viewer,我遇到了一個關於如何標記不同媒體的問題。

我目前的代碼在這裏:https://github.com/kaihendry/lk/blob/5de96f9fe012e9894deef7b9924f96dd8d9c806c/main.go#L181 肯定是錯的。我疑惑如何在https://golang.org/pkg/html/template/#Template.Execute

我看到使用template.FuncMap只使用字符串的所有實例光在這裏使用模板...

減少例如:https://play.golang.org/p/mAue8SDDw6

理想情況下,我會用HTML模板在這裏,而不是fmt.Sprintf。是的,我意識到我不是HTML轉義文件名是錯誤的,但我不知道如何從這個函數再次使用HTML模板。

預先感謝任何指導,

回答

3

您應該演示(模板)分開邏輯(功能)。 在template.FuncMap中註冊的函數不應該依賴模板作爲輸入來生成輸出。如果你想返回HTML模板作爲函數輸出,你應該手動生成它(使用fmt.Sprintf等)。

就你而言,你可以簡單地註冊一個函數來檢查媒體類型,然後使用模板的{{if}}動作產生不同的輸出。該功能可能看起來像:

func matchType(ext, s string) bool { 
    return strings.ToLower(ext) == strings.ToLower(path.Ext(s)) 
} 

和模板的樣子:

{{ range .Media }}<p> 
    {{if . | matchType ".jpg"}}<img src={{.}}> 
    {{else if . | matchType ".mp4"}}<video controls src={{.}}></video> 
    {{else}}{{.}} 
    {{end}}</p> 
{{ end }} 

根據您減少例如工作的示例:https://play.golang.org/p/U64_7UHZQU

+0

謝謝你,這種方法似乎相當好一點,但我不確定我是否喜歡「if,else,else,else」類型的結構。 – hendry