欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go中l(wèi)og包異或組合配置妙用詳解

 更新時間:2024年11月06日 15:29:51   作者:程序員二毛  
在 Go 語言的 log 包中,使用“位運算相或” (|) 來配置日志的 flag,可以讓我們靈活地組合多種日志信息輸出選項,下面我們就來看看這種方法的好處和原理吧

log 中的這種用法,你一定見過:

log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)

沒見過的,自我反省下(逃

在 Go 語言的 log 包中,使用“位運算相或” (|) 來配置日志的 flag,是為了讓我們靈活地組合多種日志信息輸出選項。,比如是否顯示日期、時間、微秒、文件名、行號等。

接下來詳細解釋這種方法的好處和原理。

1. 什么是 log 包中的 flag

log 包中,flag 是用來控制日志輸出格式的一些選項。

每種 flag 都是一個二進制位掩碼,通過不同的掩碼組合,可以控制日志的顯示內(nèi)容。

這些 flag 選項定義如下:

const (
    Ldate         = 1 << iota     // 日期:2009/01/23
    Ltime                         // 時間:01:23:23
    Lmicroseconds                 // 微秒級時間:01:23:23.123123(需要同時有 Ltime)
    Llongfile                     // 完整文件名和行號:/a/b/c/d.go:23
    Lshortfile                    // 文件名和行號:d.go:23(會覆蓋 Llongfile)
    LUTC                          // 使用 UTC 時間而非本地時間
    Lmsgprefix                    // 將“前綴”從行首移動到消息之前
    LstdFlags     = Ldate | Ltime // 默認值
)

這些常量是通過位移運算 1 << iota 定義的,保證每個 flag 只占用一位,且是唯一的。

這樣一來,我們可以用按位或操作 | 來組合多個選項。

對應的值如下:

const (
	Ldate=1 << iota// iota =0,值為 1 << 0 = 1,二進制:00000001,相當于2的0次方
	Ltime          // iota = 1,值為 1 << 1 = 2,二進制:00000010,相當于2的1次方
	Lmicroseconds  // iota = 2,值為 1 << 2 = 4,二進制:00000100,相當于2的2次方
	Llongfile      // iota = 3,值為 1 << 3 = 8,二進制:00001000,相當于2的3次方
	Lshortfile     // iota = 4,值為 1 << 4 = 16,二進制:00010000,相當于2的4次方
	LUTC           // iota = 5,值為 1 << 5 = 32,二進制:00100000,相當于2的5次方
	Lmsgprefix     // iota = 6,值為 1 << 6 = 64,二進制:01000000,相當于2的6次方
)

2. 為什么使用按位或 (|) 來組合 flag

按位或 (|) 的好處是可以任意組合選項。因為每個 flag 常量代表一個獨特的二進制位,所以它們可以通過按位或相加組合在一起,而不會產(chǎn)生沖突。例如:

  • Ltime 的值是 1 << 1,即 0b0010
  • Llongfile 的值是 1 << 3,即 0b1000

當我們使用 log.SetFlags(Ltime | Llongfile) 時,相當于將 0b0010 | 0b1000 組合成 0b1010,即同時啟用了時間和文件名短格式顯示。

通過這種位運算方式,可以組合各種 flag 選項,而不必為每種組合重新定義一個新的常量。

3. 使用按位或組合 flag 的優(yōu)勢

  • 靈活性高:可以自由選擇多個選項的組合,滿足不同需求,而不必逐一指定每個 flag。
  • 可讀性強:按位或組合表達式簡單明了,清楚地顯示啟用了哪些功能。
  • 高效性:位運算本身效率高,計算量小,而且 flag 常量設計成二進制掩碼,便于快速組合和解讀。

4. 如何識別已設置的flag

當我們通過位或組合多個flag傳遞給log.SetFlags后,log包在輸出日志時會檢測該組合值,并根據(jù)不同的位設置來確定輸出內(nèi)容。

具體的識別方式:按位與(&)操作

假設我們設置了以下flag組合:

log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)

傳入的flag組合會是一個整型值,log包會在生成日志時,通過按位與操作來判斷每個flag是否存在。具體步驟如下:

  • 檢查Ldate:使用按位與操作flags & Ldate,如果結果不為0,則表示Ldate已被設置,那么日志將包含日期信息。
  • 檢查Ltime:同樣,通過flags & Ltime,非零表示Ltime被設置,日志中將包含時間信息。
  • 檢查Llongfile:按位檢查flags & Llongfile,通過判斷值來確定是否輸出文件路徑(完整路徑)。

具體來看,假設我們使用log.Ldate | log.Ltime | log.Llongfile

  • Ldate的值為00000001
  • Ltime的值為00000010。
  • Llongfile的值為00001000。

將這些flag組合在一起后的整型值是00001011,它包含了所有的設置信息。

示例:代碼實現(xiàn)flag識別的過程

log包的實現(xiàn)原理為例,可以大致模擬flag識別的過程。假設flags變量存儲了當前的flag設置值,可以如下判斷是否開啟各個功能:

package main

import (
    "log"
)

func main() {
    flags := log.Ldate | log.Ltime | log.Llongfile

    if flags&log.Ldate != 0 {
        log.Print("日期已啟用")
    }
    if flags&log.Ltime != 0 {
        log.Print("時間已啟用")
    }
    if flags&log.Llongfile != 0 {
        log.Print("完整文件路徑已啟用")
    }
}

5. 使用展示

我們來看一個例子,假設這段代碼位于 main.go 文件的第 10 行:

package main

import (
    "log"
)

func main() {
    log.SetFlags(log.Ltime | log.Lshortfile)
    log.Println("這是一個日志消息")
}

如果這段代碼在 2024 年 11 月 3 日 15:04:05 執(zhí)行,日志輸出可能會是:

15:04:05 main.go:10: 這是一個日志消息

其中,15:04:05 是時間,main.go:10 是簡化的文件名和行號。

6. 總結

使用按位或操作符 | 來配置日志 flag,可以讓我們靈活地組合日志的不同顯示選項,方便地自定義輸出格式。這種方式不僅簡化了代碼,還提高了日志配置的靈活性和可讀性。

到此這篇關于Go中l(wèi)og包異或組合配置妙用詳解的文章就介紹到這了,更多相關Go log包異或組合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言中最便捷的http請求包resty的使用詳解

    Go語言中最便捷的http請求包resty的使用詳解

    go語言雖然自身就有net/http包,但是說實話用起來沒那么好用,resty包是go語言中一個非常受歡迎的http請求處理包,下面我們一起來學習一下resty的具體使用吧
    2025-03-03
  • gin框架中使用JWT的定義需求及解析

    gin框架中使用JWT的定義需求及解析

    這篇文章主要為介紹了gin框架中使用JWT的定義需求及解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Golang?中反射的應用實例詳解

    Golang?中反射的應用實例詳解

    這篇文章主要為大家介紹了Golang?中反射的應用實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • go reflect要不要傳指針原理詳解

    go reflect要不要傳指針原理詳解

    這篇文章主要為大家介紹了go reflect要不要傳指針原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 使用go進行云存儲上傳實現(xiàn)實例

    使用go進行云存儲上傳實現(xiàn)實例

    這篇文章主要為大家介紹了使用go進行云存儲上傳實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2024-01-01
  • golang中context使用小結

    golang中context使用小結

    本文主要介紹了golang中context使用小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-11-11
  • 從go語言中找&和*區(qū)別詳解

    從go語言中找&和*區(qū)別詳解

    這篇文章主要介紹了從go語言中找&和*區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Go?WEB框架使用攔截器驗證用戶登錄狀態(tài)實現(xiàn)

    Go?WEB框架使用攔截器驗證用戶登錄狀態(tài)實現(xiàn)

    這篇文章主要為大家介紹了Go?WEB框架使用攔截器驗證用戶登錄狀態(tài)實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 深入了解Golang中的反射機制

    深入了解Golang中的反射機制

    反射是指在程序運行時動態(tài)地檢查和修改對象的能力,在Go語言中,通過反射可以在運行時檢查變量的類型、獲取結構體字段和方法的信息,以及動態(tài)調(diào)用方法等操作,本文將帶你深入了解Golang中的反射機制,感興趣的同學可以跟著小編一起來學習
    2023-05-05
  • Golang在整潔架構基礎上實現(xiàn)事務操作

    Golang在整潔架構基礎上實現(xiàn)事務操作

    這篇文章在 go-kratos 官方的 layout 項目的整潔架構基礎上,實現(xiàn)優(yōu)雅的數(shù)據(jù)庫事務操作,需要的朋友可以參考下
    2024-08-08

最新評論