gva global
包名可以充当 global 对象
是的,你理解得非常正确。在 Go 语言中,可以通过定义一个包(例如 global 包)来管理全局变量,这个包在某种程度上充当了类似于 Node.js 中的全局 global 对象的角色。
具体实现方式
- 定义全局变量包:
创建一个名为
global的包,在其中定义全局变量。
// global/global.go
package global
import (
"github.com/spf13/viper"
"go.uber.org/zap"
"gorm.io/gorm"
)
var (
GVA_DB *gorm.DB
GVA_VP *viper.Viper
GVA_LOG *zap.Logger
)
- 初始化全局变量:
在程序启动时,初始化这些全局变量。可以在
main包的main函数中进行初始化,也可以使用init函数进行自动初始化。
// main.go
package main
import (
"github.com/spf13/viper"
"go.uber.org/zap"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"myapp/global"
)
func initConfig() *viper.Viper {
vp := viper.New()
// 配置初始化逻辑
return vp
}
func initLogger() *zap.Logger {
logger, _ := zap.NewProduction()
return logger
}
func initDB() *gorm.DB {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
return db
}
func main() {
global.GVA_VP = initConfig()
global.GVA_LOG = initLogger()
global.GVA_DB = initDB()
// 现在可以安全地使用 global.GVA_VP, global.GVA_LOG, global.GVA_DB
global.GVA_LOG.Info("Application started")
}
或者使用 init 函数自动初始化:
// global/global.go
package global
import (
"github.com/spf13/viper"
"go.uber.org/zap"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
var (
GVA_DB *gorm.DB
GVA_VP *viper.Viper
GVA_LOG *zap.Logger
)
func init() {
GVA_VP = viper.New()
// 配置初始化逻辑
GVA_LOG, _ = zap.NewProduction()
var err error
GVA_DB, err = gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
}
在 main 包中直接使用这些全局变量:
// main.go
package main
import (
"myapp/global"
)
func main() {
// 现在可以安全地使用 global.GVA_VP, global.GVA_LOG, global.GVA_DB
global.GVA_LOG.Info("Application started")
}
总结
通过创建一个 global 包并在其中定义全局变量,可以在 Go 语言中实现类似于 Node.js 中 global 对象的功能。关键在于确保这些全局变量在使用前已经被正确初始化。这样做不仅可以提高代码的可读性和可维护性,还可以避免空指针引用错误。