web-dev-qa-db-fra.com

Comment avoir une variable globale accessible dans tous les paquets de golang

J'ai un fichier main.go qui a:

// running the router in port 9000
func main() {
    router,Global := routers.InitApp()
    fmt.println(Global)
    router.RunTLS(":9000" , "domain.crt" , "domain.key")
}

Dans router.InitMap, je souhaite déclarer une variable globale accessible partout dans mon application. Est-ce possible? j'ai essayé

func InitApp() (*gin.Engine,string) {
        var Global= "myvalue"           
        router := gin.New()
        return router,Global


}

Mais je peux accéder à la variable Global même dans le même package.

11
aaj

déclarer une variable au niveau supérieur - en dehors de toute fonction:

var Global = "myvalue"

func InitApp() (string) {
        var Global= "myvalue"
        return Global

}

Étant donné que le nom de la variable commence par une lettre majuscule, la variable sera disponible à la fois dans le package actuel par son nom - et dans tout autre package lorsque vous importez le package définissant la variable et que vous le qualifiez avec le nom suivant: return packagename.Global.

Voici une autre illustration (également dans la cour de récréation de Go: https://play.golang.org/p/h2iVjM6Fpk ):

package main

import (
    "fmt"
)

var greeting = "Hello, world!"

func main() {
    fmt.Println(greeting)
}

Voir aussi Go Tour: "Variables" https://tour.golang.org/basics/8 et "Noms exportés" https://tour.golang.org/basics/3 .

18
dmitris

Il est préférable d'utiliser la fonction init pour l'initialisation des variables globales. Il sera également traité une seule fois, même plusieurs fois de ce paquet. https://play.golang.org/p/0PJuXvWRoSr

package main

import (
        "fmt"
)

var Global string 

func init() { 
        Global = InitApp()
}

func main() {
    fmt.Println(Global)
}

func InitApp() (string) {
        return "myvalue"
}
0
Roman Shishkin