【问题标题】:Global Variable Not Passing To Next Package全局变量不传递到下一个包
【发布时间】:2017-05-12 16:20:46
【问题描述】:

由于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()
}

只想知道我做错了什么,这样我就可以在将来防止这个错误。谢谢你:)

【问题讨论】:

  • 你在哪里尝试将连接传递给AchFactory.go
  • 如果 Start.go 在包 x 下,你想调用变量 DB 到另一个包,你应该在变量名x.DB之前添加包名然后点。 note: 好的包名要简短明了。它们是小写字母,没有下划线或混合大写字母。
  • 请包含来自 Start.goAchFactory.go 的导入语句。您还提到了一个您想要防止的错误,但您没有包含实际的错误消息,如果我们知道您遇到的确切错误,我们会更容易为您提供帮助。

标签: mysql go


【解决方案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.goStart.go 位于不同的包中,则AchFactory.go 文件需要import 包含Start.go 文件的包,然后才能访问导出的成员在导入的包中,您在它们前面加上包的名称,并用点将两者连接起来;例如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")
}

【讨论】:

  • 谢谢大家的帮助,已经修复了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 2013-07-16
  • 2013-05-31
  • 2014-05-14
相关资源
最近更新 更多