在Go語言中,我們可以在.go檔案中定義函數並直接呼叫它們,也可以在Go模板中呼叫函數。然而,在兩種情況下,函數的運作方式和呼叫方式存在一些差異。在.go檔案中執行函數時,我們可以直接透過函數名稱和參數列表來調用函數,而在模板中調用函數時,我們需要使用{{}}語法來包裹函數調用,並將函數名稱作為模板指令的一部分。此外,模板中的函數呼叫可以在模板渲染過程中動態執行,而在.go檔案中運行函數時,函數的執行是靜態的,不會受到模板渲染的影響。因此,根據特定的使用場景和需求,我們可以選擇適合的方式來運行函數和呼叫它們。
使用 text/template
套件中的 template.funcmap
,您可以直接從 go 範本檔案中存取函數。
假設以下場景:在使用者概述頁面的處理程序中,呼叫函數 getallusers
並使用 executetemplate
將使用者物件傳遞給範本:
func index(w http.responsewriter, r *http.request) { users, err := model.getallusers() if err != nil { render50x() return } data := make(map[string]interface{}) data["userlist"] = users render(w, r, data, "layout", "index") }
這與將函數傳遞給模板並在那裡執行它相同嗎?
var funcs = template.funcmap{ "getallusers": model.getallusers, } // func render t := template.new("render").funcs(funcs) if err := template.must(t.parsefs(viewsfs, files...)).executetemplate(w, layout, data); err != nil { log.println("error executing template:", err.error()) }
{{ range getAllUsers }} {{ .DisplayName }} {{ end }}
這兩種方法有差別嗎?
如果可以從模板中呼叫函數,那就是一樣的。一些差異:
如果你在Go中呼叫它,則不需要註冊該函數。有時您無法存取模板解析來註冊函數,因此這是唯一的方法(不要忘記:您必須在解析模板之前註冊函數)。
此外,如果你在 Go 中呼叫它,你對它有更多的「控制」:你可以從恐慌中恢復,你可以預處理結果,並且你可以在其他 Go 程式碼中重複使用它。您也可以根據結果選擇不執行模板,或執行模板中可能無法(輕鬆)表達的其他操作。
函數的結果也可能不容易渲染。例如。它可能不是 string
,或者可能沒有 String() string
方法。因此,可能需要一些額外的 (Go) 邏輯將結果轉換為人類可讀的格式,這在模板中可能不可用,或者可能需要註冊更多函數。
另請注意,並非所有函數都可以從模板註冊和呼叫。可呼叫函數最多可以有 2 個回傳類型,秒數只能是 error
。從 Go 中,您可以呼叫“任何”函數並僅傳遞您需要的結果。如果函數有參數,您還必須將它們作為資料傳遞給模板執行(這樣您就可以在呼叫函數時將它們傳遞到模板中)。
以上是在 .go 檔案中運行函數和在 Go 模板中調用它有什麼區別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!