2016-07-29 104 views
4

我有具有main.go文件:如何跨所有包一個全局變量訪問在golang

// 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

+0

你爲什麼想這麼做?你將很難測試的東西。 – ale64bit

+0

我想在應用程序啓動時爲應用程序獲取配置數據。這是通過一個rest API返回的。例如:數據庫主機名,用戶名等。 – aaj

+1

然後首先在函數'InitApp'之外聲明變量:'var Global string',然後在準備就緒時爲其分配一個值。 – ale64bit

回答

9

在頂層聲明變量 - 的任何功能以外:

var Global = "myvalue" 

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

} 

由於變量的名稱以大寫字母開頭,變量將在當前包既可以通過其名稱 - 以及在導入定義變量的包時使用包名進行限定的任何其他包中,如:return packagename.Global

這裏的另一個例證(也轉到操場:https://play.golang.org/p/h2iVjM6Fpk):

package main 

import (
    "fmt" 
) 

var greeting = "Hello, world!" 

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

參見圍棋之旅: 「變量」 https://tour.golang.org/basics/8和 「導出名稱」 https://tour.golang.org/basics/3

+0

我注意到,如果我從函數的返回值中獲取全局變量。每次調用這個函數。對於如:'VAR全球= InitApp FUNC InitApp()(字符串){VAR 環球= 「myvalue的」 回報全球 }'每次我嘗試訪問全局,InitApp被調用。無論如何,我可以避免這種情況嗎?我希望全局變量只被提取一次。 – aaj

+0

確保使用()調用該函數,例如:var Global = InitApp()有關可運行示例,請參閱https://play.golang.org/p/jdsFqFVxVi。 – dmitris