全局变量未传递到下一个包

时间:2017-05-12 04:09:31

标签: mysql go

因为golang不支持循环依赖,而我只是刚开始使用golang。我用连接变量遇到了一个小墙,我使用gorm驱动程序,MySQL作为我的数据库引擎。

我正在尝试将连接变量传递给我的程序调用的下一个函数,该函数位于另一个文件中。 的 AchFactory.go

fmt.Println(">Loading Achievements")
Start.DB.HasTable("achievements")
Start.DB.Select("id", "group_name", "category", "level", "reward_pixels", "reward_points", "progress_needed", "game_id").Find("achievements")
fmt.Println(">Found Schema")

Start.go

var DB *gorm.DB

func Initi() {
    fmt.Println("Initating!")
    Connect()
}

func Connect() {
    var err error
    DB, err = gorm.Open("mysql", config.MYSQL_USER+":"+config.MYSQL_PASS+"@/"+config.MYSQL_DB+"?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        panic(err)
        DB.Close()
    }
    fmt.Println(">Connection Succesful")
    fmt.Println(">Test Query Starting")
    TestQ()
}

func TestQ() {
    DB.HasTable("tests")
    fmt.Println(">Query Succesful!")
    AchManager.GetAch()
}

我想知道我做错了什么,以便将来可以防止这个错误。谢谢:))

1 个答案:

答案 0 :(得分:1)

如果您的AchFactory.go文件与Start.go文件位于同一个文件包中,则不需要在DB前加上任何内容,因为这两个文件都位于同一个文件包中两者都共享在包级别定义的变量。

例如:

.
└── foo
    ├── AchFactory.go
    └── Start.go

Start.go

package foo

// ...

var DB *gorm.DB

// ...

AchFactory.go

package foo

func F() {
    fmt.Println(">Loading Achievements")
    DB.HasTable("achievements")
    DB.Select("id", "group_name", "category", "level", "reward_pixels", "reward_points", "progress_needed", "game_id").Find("achievements")
    fmt.Println(">Found Schema")
}

另一方面,如果AchFactory.go位于与Start.go不同的包中,则AchFactory.go文件需要import包含Start.go的包}然后,要访问导入的pacakge的导出成员,请在其前面加上包的名称,并用点加入两个;例如packagename.Membername

例如:

.
├── foo
│   └── Start.go
└── bar
    └── AchFactory.go

Start.go

package foo

// ...

var DB *gorm.DB

// ...

AchFactory.go

package bar

import (
    "fmt"
    "path/to/foo"
)

func F() {
    fmt.Println(">Loading Achievements")
    foo.DB.HasTable("achievements")
    foo.DB.Select("id", "group_name", "category", "level", "reward_pixels", "reward_points", "progress_needed", "game_id").Find("achievements")
    fmt.Println(">Found Schema")
}