Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah perbezaan antara menjalankan fungsi dalam fail .go dan memanggilnya dalam templat Go?

Apakah perbezaan antara menjalankan fungsi dalam fail .go dan memanggilnya dalam templat Go?

WBOY
WBOYke hadapan
2024-02-09 12:51:17437semak imbas

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

Dalam bahasa Go, kami boleh mentakrifkan fungsi dalam fail .go dan memanggilnya terus, atau kami boleh memanggil fungsi dalam templat Go. Walau bagaimanapun, terdapat beberapa perbezaan dalam cara fungsi dijalankan dan dipanggil dalam kedua-dua kes. Apabila menjalankan fungsi dalam fail .go, kita boleh memanggil fungsi secara terus melalui nama fungsi dan senarai parameter Apabila memanggil fungsi dalam templat, kita perlu menggunakan sintaks {{}} untuk membungkus panggilan fungsi dan menggunakan fungsi. nama sebagai bahagian arahan templat. Selain itu, panggilan fungsi dalam templat boleh dilaksanakan secara dinamik semasa pemaparan templat, manakala apabila menjalankan fungsi dalam fail .go, pelaksanaan fungsi adalah statik dan tidak akan terjejas oleh pemaparan templat. Oleh itu, bergantung pada senario dan keperluan penggunaan tertentu, kita boleh memilih cara yang sesuai untuk menjalankan fungsi dan memanggilnya.

Kandungan soalan

Menggunakan text/template 包中的 template.funcmap, anda boleh mengakses fungsi terus daripada fail templat go.

Andaikan senario berikut: Dalam pengendali halaman gambaran keseluruhan pengguna, panggil fungsi getallusers 并使用 executetemplate menghantar objek pengguna ke templat:

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")
}

Adakah ini sama seperti menghantar fungsi kepada templat dan melaksanakannya di sana?

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 }}

Adakah perbezaan antara kedua-dua kaedah ini?

Penyelesaian

Ia adalah perkara yang sama jika fungsi boleh dipanggil dari templat. Beberapa perbezaan:

Jika anda memanggilnya dalam Go, anda tidak perlu mendaftarkan fungsi tersebut. Kadangkala anda tidak mempunyai akses kepada penghuraian templat untuk mendaftarkan fungsi, jadi ini adalah satu-satunya cara (jangan lupa: anda perlu mendaftarkan fungsi tersebut sebelum menghuraikan templat).

Selain itu, jika anda memanggilnya dalam Go, anda mempunyai lebih "kawalan" ke atasnya: anda boleh pulih daripada panik, anda boleh praproses keputusan dan anda boleh menggunakannya semula dalam kod Go yang lain. Anda juga boleh memilih untuk tidak melaksanakan templat berdasarkan hasil, atau melakukan tindakan lain yang mungkin tidak (mudah) dapat diungkapkan dalam templat.

Hasil sesuatu fungsi juga mungkin tidak mudah dipaparkan. Contohnya. Ia mungkin bukan kaedah string,或者可能没有 String() string. Oleh itu, beberapa logik tambahan (Go) mungkin diperlukan untuk menukar hasil ke dalam format yang boleh dibaca manusia, yang mungkin tidak tersedia dalam templat, atau lebih banyak fungsi mungkin perlu didaftarkan.

Juga ambil perhatian bahawa tidak semua fungsi boleh didaftarkan dan dipanggil dari templat. Fungsi boleh panggil boleh mempunyai sehingga 2 jenis pemulangan dan bilangan saat hanya boleh error. Dari Go, anda boleh memanggil fungsi "mana-mana" dan lulus hanya hasil yang anda perlukan. Jika fungsi mempunyai parameter, anda juga mesti menghantarnya sebagai data kepada pelaksanaan templat (supaya anda boleh menghantarnya ke dalam templat apabila memanggil fungsi).

Atas ialah kandungan terperinci Apakah perbezaan antara menjalankan fungsi dalam fail .go dan memanggilnya dalam templat Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam