sync.Once实现单例模式, 从yml文件获取配置信息。
package main
import (
yml "gopkg.in/yaml.v2"
"io/ioutil"
"log"
"sync"
)
type Config struct {
Host string `yaml:"host"`
Port int `yaml:"port"`
}
var (
cfg *Config
once = &sync.Once{}
)
// 获取实例对象
func GetInstance() *Config {
var (
err error
c *Config
)
c, err = GetCfg()
if err != nil {
log.Fatal(err)
return nil
}
if c == nil {
return nil
}
once.Do(func() {
cfg = &Config{
Host: c.Host,
Port: c.Port,
}
})
return cfg
}
// 从yml配置文件读取Config配置
func GetCfg() (*Config, error) {
var (
file []byte
err error
cfg Config
)
if file, err = ioutil.ReadFile("./cfg.yml"); err != nil {
log.Fatal("read config file err, err:", err)
return nil, err
}
if err = yml.Unmarshal(file, &cfg); err != nil {
log.Fatal("config file unmarshal err, err:", err)
return nil, err
}
return &cfg, nil
}
func main() {
c1 := GetInstance()
c2 := GetInstance()
fmt.Println(fmt.Sprintf("c1:%p", c1))
fmt.Println(fmt.Sprintf("c2:%p", c2))
}



