Go標(biāo)準(zhǔn)庫Flag庫和Log庫的使用
一.Flag
Go語言內(nèi)置的flag包實現(xiàn)了命令行參數(shù)的解析,flag包使得開發(fā)命令行工具更為簡單。
1.1 os.Args
如果你只是簡單的的想要獲取命令行參數(shù),可以像下面代碼示例一樣使用os.Args來獲取命令行參數(shù)。
os.Arg實際是一個存儲命令行參數(shù)的字符串切片([]string),它的第一個元素是執(zhí)行文件的名稱。
1.2 flag包的基本使用
導(dǎo)入flag包
import fmt
flag參數(shù)類型
flag包支持的命令行參數(shù)類型有bool,int,int64,uint,uint64,float,float64,string,duration。
1.2.1 定義命令行flag參數(shù)
有以下兩種常見的定義命令行flag參數(shù)的方法。
flag.Type()
基本格式如下:
flag.Type(flag名,默認(rèn)值,幫助信息) *Type。
例如我們要定義姓名,年齡,婚否三個命令行參數(shù),我們可以按如下方式定義:
name := flag.String("name", "張三", "姓名") age := flag.Int("age", 25, "年齡") married := flag.Bool("married", false, "婚否") delay := flag.Duration("d", 0, "時間間隔")
需要注意的是:此時name,age, married,delay均為對應(yīng)類型的指針。
flag.TypeVar()
基本格式如下:flag.TypeVar(Type指針,flag名,默認(rèn)值,幫助信息)
例如我們要定義姓名,年齡,婚否三個命令參數(shù),我們可以按照如下方式定義。
func main() { var name string var age int var married bool var d time.Duration flag.StringVar(&name, "name", "張三", "姓名") flag.IntVar(&age, "age", 25, "年齡") flag.BoolVar(&married, "married", false, "婚否") flag.DurationVar(&d, "d", 0, "時間間隔") fmt.Println(name, age, married, d) }
flag.Parse()
通過以上兩種方式定義號命令行flag參數(shù)后,需要通過調(diào)用flag.Parse()來對命令行參數(shù)進行解析。
支持的命令行參數(shù)格式有以下幾種:
- -flag xxx (使用空格,一個'-'符號)
- --flag xxx (使用空格,兩個'-'符號)
- -flag=xxx(使用等號,一個'-'符號)
- --flag=xxx(使用等號,兩個'--'符號)
其中布爾類型的參數(shù)必須使用等號的方式指定。
flag解析在第一個非flag參數(shù)(單個'-'不是flag參數(shù))之前停止,或者在終止符'-'之后停止。
1.2.2 flag其它函數(shù)
- flag.Args():返回命令行參數(shù)后的其它參數(shù),以[]string類型
- flag.NArg():返回命令行參數(shù)后的其它參數(shù)個數(shù)
- flag.NFlag():返回使用命令行參數(shù)個數(shù)
1.2.3 使用
二. Log
Go語言內(nèi)置的log包實現(xiàn)了簡單的日志服務(wù)。本文介紹了標(biāo)準(zhǔn)庫log的基本使用。
1.1 使用Logger
log包定義了Logger類型,該類型提供了一些格式化輸出的方法。本包也提供了一個預(yù)定義的"標(biāo)準(zhǔn)"logger,可以通過調(diào)用函數(shù)Print系列(Print | Printf | Println),F(xiàn)atal系列(Fatal | Fatalf | Fatalln),Panic系列(Panic | Panicf | Panicln) 來使用,比自行創(chuàng)建一個logger對象更容易使用。
例如:
logger會打印每條日志信息的日期,時間,默認(rèn)輸出到系統(tǒng)的標(biāo)準(zhǔn)錯誤。Fatal系列函數(shù)會在寫入日志信息后調(diào)用os.Exit(1)。Panic系列函數(shù)會在寫入日志信息后Panic。
1.2 配置logger
默認(rèn)情況下的logger只會提供日志的時間信息,但是很多情況下我們希望得到更多的信息,比如記錄該日志文件名和行號等。log標(biāo)準(zhǔn)庫中為我們提供了定制這些設(shè)置的方法。
log標(biāo)準(zhǔn)庫中的Flags函數(shù)會返回標(biāo)準(zhǔn)logger的輸出設(shè)置,而SetFlags函數(shù)用來設(shè)置標(biāo)準(zhǔn)logger的輸出配置。
func Flags() int func SetFlags(flag int)
flag選項
log標(biāo)準(zhǔn)庫提供了如下的flag選項,它們是一系列定義好的常量。
const ( // 字位共同控制輸出日志信息的細(xì)節(jié)。不能控制輸出的順序和格式。 // 在所有項目后會有一個冒號:2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message 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) LstdFlags = Ldate | Ltime // 標(biāo)準(zhǔn)logger的初始值 )
下面設(shè)置一下標(biāo)準(zhǔn)logger的輸出選項:
1.3 配置日志前綴
log標(biāo)準(zhǔn)庫中還提供了關(guān)于日志信息前綴的兩種方法:
func (l *Logger) Prefix() string func (l *Logger) SetPrefix(prefix string)
其中Prefix函數(shù)用來查看標(biāo)準(zhǔn)logger的輸出前綴,SetPrefix函數(shù)用來設(shè)置輸出前綴。
這樣我們就能夠在代碼中為我們的日志信息添加指定前綴,方便之后對日志信息進行檢索和處理。
1.4 配置日志輸出位置
func SetOutput(w io.Writer)
SetOutput函數(shù)用來設(shè)置標(biāo)準(zhǔn)logger的輸出目的地。默認(rèn)是標(biāo)準(zhǔn)錯誤。
例如:我們將日志信息輸出來文件中:
如果你要使用標(biāo)準(zhǔn)的logger,我們通常會把上面的配置操作寫到init函數(shù)中。
package main import ( "fmt" "log" "os" ) func init() { logfile, err := os.OpenFile("./xx.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { fmt.Println("open file fail") return } log.SetOutput(logfile) log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Llongfile) } func main() { log.SetPrefix("[hello]") log.Println("這是一條普通的日志") }
1.5 創(chuàng)建logger
log標(biāo)準(zhǔn)庫還提供了一個創(chuàng)建新logger對象的構(gòu)造函數(shù)——New,支持我們創(chuàng)建自己的logger實例,New函數(shù)簽名如下:
func New(out io.Writer, prefix string, flag int) *Logger
New創(chuàng)建一個Logger對象,其中參數(shù)out設(shè)置日志信息寫入目的地,參數(shù)prefix會添加到生成的每條日志的前綴,參數(shù)flag定義日志的屬性(時間,文件等)。
總結(jié):log標(biāo)準(zhǔn)庫的功能有限,例如無法滿足記錄不同級別的日志情況,我們實際項目中根據(jù)自己的需要選擇使用第三方的日志庫,如logrus,zap等。
到此這篇關(guān)于Go標(biāo)準(zhǔn)庫Flag庫和Log庫的使用的文章就介紹到這了,更多相關(guān)Go Flag庫 Log庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言時間管理利器之深入解析time模塊的實戰(zhàn)技巧
本文深入解析了Go語言標(biāo)準(zhǔn)庫中的time模塊,揭示了其高效用法和實用技巧,通過學(xué)習(xí)time模塊的三大核心類型(Time、Duration、Timer/Ticker)以及高頻使用場景,開發(fā)者可以更好地處理時間相關(guān)的任務(wù),感興趣的朋友一起看看吧2025-03-03go mayfly開源項目代碼結(jié)構(gòu)設(shè)計
這篇文章主要為大家介紹了go mayfly開源項目代碼結(jié)構(gòu)設(shè)計詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11golang validator參數(shù)校驗的實現(xiàn)
這篇文章主要介紹了golang validator參數(shù)校驗的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10