Maison > développement back-end > Golang > le corps du texte

Quelle est la différence entre exécuter une fonction dans un fichier .go et l'appeler dans un modèle Go ?

WBOY
Libérer: 2024-02-09 12:51:17
avant
436 Les gens l'ont consulté

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

En langage Go, nous pouvons définir des fonctions dans des fichiers .go et les appeler directement, ou nous pouvons appeler des fonctions dans des modèles Go. Cependant, il existe certaines différences dans la manière dont la fonction est exécutée et appelée dans les deux cas. Lors de l'exécution d'une fonction dans un fichier .go, nous pouvons appeler la fonction directement via le nom de la fonction et la liste des paramètres. Lors de l'appel de la fonction dans le modèle, nous devons utiliser la syntaxe {{}} pour envelopper l'appel de fonction et utiliser la fonction. name comme partie de la directive du modèle. De plus, les appels de fonctions dans les modèles peuvent être exécutés dynamiquement pendant le rendu du modèle, tandis que lors de l'exécution de fonctions dans des fichiers .go, l'exécution des fonctions est statique et ne sera pas affectée par le rendu du modèle. Par conséquent, en fonction des scénarios d'utilisation et des besoins spécifiques, nous pouvons choisir la manière appropriée d'exécuter les fonctions et de les appeler.

Contenu de la question

En utilisant text/template 包中的 template.funcmap, vous pouvez accéder aux fonctions directement à partir des fichiers de modèle Go.

Supposons le scénario suivant : dans le gestionnaire de la page de présentation de l'utilisateur, appelez la fonction getallusers 并使用 executetemplate en passant l'objet utilisateur au modèle :

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")
}
Copier après la connexion

Est-ce la même chose que passer une fonction à un modèle et l'exécuter là-bas ?

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

Copier après la connexion
{{ range getAllUsers }}
  {{ .DisplayName }}
{{ end }}
Copier après la connexion

Y a-t-il une différence entre ces deux méthodes ?

Solution de contournement

C'est la même chose si la fonction peut être appelée depuis le modèle. Quelques différences :

Si vous l'appelez dans Go, vous n'avez pas besoin d'enregistrer la fonction. Parfois, vous n'avez pas accès à l'analyse des modèles pour enregistrer une fonction, c'est donc le seul moyen (n'oubliez pas : vous devez enregistrer la fonction avant d'analyser le modèle).

De plus, si vous l'appelez dans Go, vous avez plus de « contrôle » sur lui : vous pouvez récupérer des paniques, vous pouvez prétraiter les résultats et vous pouvez le réutiliser dans un autre code Go. Vous pouvez également choisir de ne pas exécuter le modèle en fonction des résultats, ou d'effectuer d'autres actions qui peuvent ne pas être (facilement) exprimables dans le modèle.

Le résultat d'une fonction peut également ne pas être facilement rendu. Par exemple. Ce n'est peut-être pas la méthode string,或者可能没有 String() string. Par conséquent, une logique (Go) supplémentaire peut être nécessaire pour convertir les résultats dans un format lisible par l'homme, qui peut ne pas être disponible dans le modèle, ou il peut être nécessaire d'enregistrer davantage de fonctions.

Notez également que toutes les fonctions ne peuvent pas être enregistrées et appelées à partir de modèles. Une fonction appelable peut avoir jusqu'à 2 types de retour et le nombre de secondes ne peut être que error. Depuis Go, vous pouvez appeler « n’importe quelle » fonction et transmettre uniquement les résultats dont vous avez besoin. Si la fonction a des paramètres, vous devez également les transmettre sous forme de données à l'exécution du modèle (afin de pouvoir les transmettre au modèle lors de l'appel de la fonction).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!