Maison  >  Article  >  développement back-end  >  Quelle est la différence entre exécuter une fonction dans un fichier .go et l’appeler dans un modèle Go ?

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

WBOY
WBOYavant
2024-02-09 12:51:17437parcourir

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

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

{{ range getAllUsers }}
  {{ .DisplayName }}
{{ end }}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer