Как сделать глобальную переменную доступной для всех пакетов

У меня есть файл main.go, который имеет:

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

В router.InitMap я хочу объявить глобальную переменную, к которой можно получить доступ в любом месте моего приложения. Это возможно? Я пытался:

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


}

Но я не могу получить доступ к переменной Global даже в том же пакете.

Ответ 1

объявить переменную на верхнем уровне - вне любых функций:

var Global = "myvalue"

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

}

Так как имя переменной начинается с буквы верхнего регистра, переменная будет доступна как в текущем пакете через его имя, так и в любом другом пакете при импорте пакета, определяющего переменную, и присвоить его с именем пакета как in: return packagename.Global.

Вот еще одна иллюстрация (также на игровой площадке Go: https://play.golang.org/p/h2iVjM6Fpk):

package main

import (
    "fmt"
)

var greeting = "Hello, world!"

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

Смотрите также Go Tour: "Переменные" https://tour.golang.org/basics/8 и "Экспортированные имена" https://tour.golang.org/basics/3.

Ответ 2

Лучше использовать функцию init для инициализации глобальных переменных. Он также будет обработан только один раз, даже в многократных включениях этого пакета. 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"
}