3 回答
TA贡献1784条经验 获得超7个赞
我的建议是声明一个全局变量config.go并使用该init()函数对其进行初始化。这样,您就知道该变量在任何包导入时都会被初始化。这是一些代码:
package models
import (
"io/ioutil"
"encoding/json"
)
var (
Configuration Config
)
init() {
args := os.Args[1:]
if len(args) == 0{
fmt.Println("********************\nMust specify a config file in args\n********************")
os.Exit(1)
}
Configuration = NewConfig(args[0]) // configuration initialized here
}
type Config struct {
Db map[string]string `json:"db"`
Server map[string]string `json:"server"`
}
func NewConfig(fname string) *Config{
data,err := ioutil.ReadFile(fname)
if err != nil{
panic(err)
}
config := Config{}
err = json.Unmarshal(data,&config)
if err != nil {
panic(err)
}
return config
}
var()将在之前运行init(),但init()将在导入它的包中的代码之前运行。因此,如果main.go导入models包,则init()inmodels将在内部的任何代码之前运行main.go,因此该变量Configuration将在使用之前进行初始化。
TA贡献1808条经验 获得超4个赞
现在你想要的只是提供一个可以在另一个包中使用的变量,解决方案很简单,记住如果你声明一个以大写字母开头的变量名:[AZ],这个变量可以在另一个包中可见并使用去。
所以,你只需要重命名config你main.go来Config,并提取其作为全局变量:
var Config *models.Config
func main(){
args := os.Args[1:]
if len(args) == 0{
fmt.Println("********************\nMust specify a config file in args\n********************")
os.Exit(1)
}
Config = models.NewConfig(args[0])
port := Config.Server["PORT"]
router := routing.NewRouter()
fmt.Printf( "-------------------------------------------------\n"+
"Listening and Serving on Port %s\n"+
"-------------------------------------------------",port)
log.Fatal(http.ListenAndServe(":"+port,router))
}
当你想在另一个包中使用它时,只需调用<package name>.Config,包名是你的 main.go 所属的包名,也许main在你的情况下。
- 3 回答
- 0 关注
- 237 浏览
添加回答
举报