3 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊
我的建議是聲明一個(gè)全局變量config.go并使用該init()函數(shù)對其進(jìn)行初始化。這樣,您就知道該變量在任何包導(dǎo)入時(shí)都會被初始化。這是一些代碼:
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()將在之前運(yùn)行init(),但init()將在導(dǎo)入它的包中的代碼之前運(yùn)行。因此,如果main.go導(dǎo)入models包,則init()inmodels將在內(nèi)部的任何代碼之前運(yùn)行main.go,因此該變量Configuration將在使用之前進(jìn)行初始化。

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊
現(xiàn)在你想要的只是提供一個(gè)可以在另一個(gè)包中使用的變量,解決方案很簡單,記住如果你聲明一個(gè)以大寫字母開頭的變量名:[AZ],這個(gè)變量可以在另一個(gè)包中可見并使用去。
所以,你只需要重命名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))
}
當(dāng)你想在另一個(gè)包中使用它時(shí),只需調(diào)用<package name>.Config,包名是你的 main.go 所屬的包名,也許main在你的情況下。
- 3 回答
- 0 關(guān)注
- 275 瀏覽
添加回答
舉報(bào)