<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 使用包級全局變量 在前面的章節中,我們使用的log都是包級別的變量。有時,構建庫以支持具有各種方法和頂級函數的結構是有用的,這樣就可以直接使用它們而無需傳遞。 本節演示了如何使用sync.Once確保全局日志logger僅初始化一次。它也可以通過Set方法繞過。示例中只導出WithField和Debug,但對于你可以想象到的其他附加到日志對象的每個方法也適用。 ### 實踐 1. 獲取第三方庫: ``` go get github.com/apex/log ``` 2. 建立global.go: ``` package global import ( "errors" "os" "sync" "github.com/sirupsen/logrus" ) var ( log *logrus.Logger initLog sync.Once ) // Init設置logger 如果多次初始化 會返回錯誤 func Init() error { err := errors.New("already initialized") initLog.Do(func() { err = nil log = logrus.New() log.Formatter = &logrus.JSONFormatter{} log.Out = os.Stdout log.Level = logrus.DebugLevel }) return err } // SetLog 設置log func SetLog(l *logrus.Logger) { log = l } // WithField 使用全局log返回logrus.Entry指針 func WithField(key string, value interface{}) *logrus.Entry { return log.WithField(key, value) } // Debug 使用全局log記錄信息 func Debug(args ...interface{}) { log.Debug(args...) } ``` 3. 建立log.go: ``` package global // UseLog 演示了使用全局 log func UseLog() error { if err := Init(); err != nil { return err } // 如果在其他包 應該調用global.WithField 和 global.Debug WithField("key", "value").Debug("hello") Debug("test") return nil } ``` 4. 建立main.go: ``` package main import "github.com/agtorre/go-cookbook/chapter4/global" func main() { if err := global.UseLog(); err != nil { panic(err) } } ``` 5. 這會輸出: ``` {"key":"value","level":"debug","msg":"hello","time":"2017-02- 12T19:22:50-08:00"} {"level":"debug","msg":"test","time":"2017-02-12T19:22:50- 08:00"} ``` ### 說明 這些全局包級對象的常見模式是保持全局未導出,并僅通過方法公開所需的功能。 通常,你還可以包含一個方法,以便為需要調用對象的包返回該對象的副本。 sync.Once類型是新引入的結構。這個結構與Do方法一起只在代碼中執行一次。我們在初始化代碼中使用它,如果多次調用Init,Init函數將拋出一個錯誤。 雖然此示例使用的是日志操作,但同樣也可以想象為對數據庫連接,數據流和許多常見用例的使用。 * * * * 學識淺薄,錯誤在所難免。歡迎在群中就本書提出修改意見,以饗后來者,長風拜謝。 Golang中國(211938256) beego實戰(258969317) Go實踐(386056972)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看