Skip to main content

gva global

包名可以充当 global 对象

是的,你理解得非常正确。在 Go 语言中,可以通过定义一个包(例如 global 包)来管理全局变量,这个包在某种程度上充当了类似于 Node.js 中的全局 global 对象的角色。

具体实现方式

  1. 定义全局变量包: 创建一个名为 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
)
  1. 初始化全局变量: 在程序启动时,初始化这些全局变量。可以在 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 对象的功能。关键在于确保这些全局变量在使用前已经被正确初始化。这样做不仅可以提高代码的可读性和可维护性,还可以避免空指针引用错误。