我有一个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
。
答案 0 :(得分:20)
在顶层声明一个变量 - 在任何函数之外:
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。
答案 1 :(得分: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"
}
答案 2 :(得分:2)
我的解决方案:
用Set和Get定义其他包中的全局变量,类似于python中的类设置
好的部分是你可以在任何包中设置全局变量,坏的部分是如果你不小心使用 Set 可能会弄乱全局变量
https://play.golang.org/p/egApePP7kPq
先定义全局变量
-- globalvar/globalvar.go --
package globalvar
import "fmt"
var Glbv int
func Set(b int) {
Glbv = b
}
func Get() int {
return Glbv
}
func Pr() {
fmt.Printf("inside globarvar = %v \n", Glbv)
} ```
then you can change the global variable in another package
-- otherpackage/otherpackage.go --
package otherpackage
import (
"fmt"
"play.ground/globalvar"
)
func Bar() {
globalvar.Set(3)
}
func Prtf() {
var cc = globalvar.Get()
fmt.Printf("inside otherpackage globalvar=%v \n", cc)
}
main function
package main
import (
"play.ground/globalvar"
"play.ground/otherpackage"
)
func main() {
globalvar.Pr()
otherpackage.Prtf()
globalvar.Set(2)
globalvar.Pr()
otherpackage.Prtf()
otherpackage.Bar()
globalvar.Pr()
otherpackage.Prtf()
}
here is the result
inside globarvar = 0
inside otherpackage globalvar=0
inside globarvar = 2
inside otherpackage globalvar=2
inside globarvar = 3
inside otherpackage globalvar=3
答案 3 :(得分:0)
你也可以像写一个函数来初始化全局变量一样:
package main
import (
"fmt"
)
func initialise() string {
CommonVariable = "global_variable"
return CommonVariable
}
var CommonVariable string
func main() {
initialise()
fmt.Println(CommonVariable)
}
如果您想从用户那里获取输入,然后将其初始化为全局变量,只需使用“Scanf”语句更改 initialise() 函数中的 CommonVariable="myvalue" 行,如下所示:
func initialise() string {
fmt.Scanln(&CommonVariable)
return CommonVariable
}