Je viens de commencer à utiliser Go pour un simple projet de programmation Web, mais je n'arrive pas à comprendre comment réaliser un simple pré-calcul local pour une seule fonction. Ceci est quelque chose que je fais assez souvent en OCaml, par exemple:Précalculer des valeurs simples pour une fonction dans Go
(* maybe render_page is a handler function for an HTTP server or something *)
let render_page =
(* let's say that Template.prepare takes a template string and returns its compiled representation *)
let templ = Template.prepare "user: {{.}}, group: {{.}}" in
(* return an anonymous function *)
fun user group ->
templ [user; group]
Pour ceux qui ne connaissent OCaml, ce qui se passe au-dessus est que je lient le nom render_page
à une fonction qui prend deux paramètres et renvoie sans doute une page Web, mais interne je crée d'abord une liaison locale à templ
(cette liaison est seulement visible dans la définition de render_page
, et le calcul ne se produit qu'une seule fois) puis en utilisant cette liaison dans une fonction anonyme, qui est la valeur réelle liée à render_page
. Ainsi, lorsque vous appelez render_page
, templ
n'est pas recompilé à chaque fois: il vient d'être extrait de l'environnement de fermeture.
Existe-t-il un modèle commun pour accomplir quelque chose comme ça dans Go? J'aimerais éviter autant que possible les variables globales. Je suis conscient que les variables "globales" peuvent être confinées à l'espace de nom d'un paquet, ce que je fais actuellement, mais je voudrais limiter la visibilité de ces expressions précalculées aux seules fonctions dans lesquelles elles sont nécessaires .
Merci!
Go ne pas variables statiques fonction locale.Si vous voulez partager une valeur mutable entre les exécutions d'une fonction, il doit s'agir d'une variable globale. Vous pouvez utiliser des constantes fonction-locales pour les valeurs immuables, mais les constantes sont limitées aux types prédéfinis. – Adrian
Vous pouvez également faire de la variable un membre d'une structure et convertir la fonction en méthode sur cette structure, en fonction de votre cas d'utilisation. Vous devez toujours vous assurer que la même instance de la structure a été réutilisée. Personnellement, je voudrais juste utiliser un global. – Adrian