btcd-go 中log部分代碼解讀

來源:互聯網
上載者:User

btcd-go 中log部分代碼

整體設計

interface : Logger struct: slog struct: Backend 
Backend
type Backend struct {   w io.Writer   mu sync.Mutex // ensures atomic writes   flag uint32}

主要實現了安全執行緒的print, printf功能,即格式化要列印日誌。 w 這個writer做為初始參數,可以從外面傳輸,解構writer,方便自己配置writer,比如std.Out/std.Err 等實現了Writer介面的struct即可。

Backend還實現了一個建立執行個體的工廠函數:

func (b* Backend) Logger(subsystemTag string) Logger {    return &slog{LevelInfo, subsystemTag, b}}
slog
type slog struct {    lvl Level    tag string    b *Backend}

這個類實現了interface: Logger所有介面。 而內部實現事業 Backend. 通過Level來控制日誌顯示層級。 tag來標識日誌來自某個子系統 subsystem.

以字元形式,按固定長度輸出數字,長度不夠,前面用0補齊。

但是這個演算法,只要i大於0才能正常工作,所以,把i類型改成uint更合適

// From stdlib log package.// Cheap integer to fixed-width decimal ASCII.  Give a negative width to avoid// zero-padding.func itoa(buf *[]byte, i int, wid int) {    // Assemble decimal in reverse order.    var b [20]byte    bp := len(b) - 1    for i >= 10 || wid > 1 {        wid--        q := i / 10        b[bp] = byte('0' + i - q*10)        bp--        i = q    }    // i < 10    b[bp] = byte('0' + i)    *buf = append(*buf, b[bp:]...)}

給slice賦值為0的用法

// recycleBuffer puts the provided byte slice, which should have been obtain via// the buffer function, back on the free list.func recycleBuffer(b *[]byte) {   *b = (*b)[:0]   bufferPool.Put(b)}

其中的 *b = (*b)[:0] 就是把b 這個byte slice賦值為0

多go routine下,使用pool來

var bufferPool = sync.Pool{   New: func() interface{} {      b := make([]byte, 0, 120)      return &b   },}

如果有多個go routine 輸出日誌,可使用pool來避免,競爭同一個緩衝,如使用同一個緩衝,會導致其他go routine掛起,而只在writer寫資料時,才使用Mutex來同步,這樣效率更高,用空間換時間。

參考

  • init functions in Go

  • iota: Elegant constants in GoLang

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.