考虑一个简单的场景,函数 ReadConfig 需要读取环境变量
    ReadConfig 可能会被多个协程并发调用,为了提升性能(减少执行时间和内存占用),
    使用 sync.Once 是一个比较好的方式。

    1. type Config struct {
    2. Server string
    3. Port int64
    4. }
    5. var (
    6. once sync.Once
    7. config *Config
    8. )
    9. func ReadConfig() *Config {
    10. once.Do(func() {
    11. var err error
    12. config = &Config{Server: os.Getenv("TT_SERVER_URL")}
    13. config.Port, err = strconv.ParseInt(os.Getenv("TT_PORT"), 10, 0)
    14. if err != nil {
    15. config.Port = 8080 // default port
    16. }
    17. log.Println("init config")
    18. })
    19. return config
    20. }
    21. func main() {
    22. for i := 0; i < 10; i++ {
    23. go func() {
    24. _ = ReadConfig()
    25. }()
    26. }
    27. time.Sleep(time.Second)
    28. }