如何在golang

时间:2016-07-29 09:51:11

标签: go

我有一个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

4 个答案:

答案 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
}