首頁  >  文章  >  後端開發  >  在 .go 檔案中運行函數和在 Go 模板中調用它有什麼區別?

在 .go 檔案中運行函數和在 Go 模板中調用它有什麼區別?

WBOY
WBOY轉載
2024-02-09 12:51:17437瀏覽

在 .go 文件中运行函数和在 Go 模板中调用它有什么区别?

在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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除