Как сделать глобальную переменную доступной для всех пакетов
У меня есть файл 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"
}