快速理解golang標準庫flag包

2021-10-09 12:23:06 字數 3165 閱讀 8652

flag包實現了命令列引數的解析

基本分為三步:

package main

import (

"flag"

"fmt"

"os"

)var (

// 1. 使用flag.string(), bool(), int()等函式註冊flag,解析後儲存到bool,int,string型別的指標

n = flag.int("n", 1, "print times .")

s = flag.string("s", "hello world", "print strings.")

// 2. 也可以先宣告變數,再用flag.boolvar把flag繫結到變數

v bool

)func init()

func main()

// 7. flag.lookup從命令列flag中返回指定名稱的flag,如果沒有則返回nil

if flag.lookup("s")!=nil }}

// 9. flag.nflag返回在命令列使用的flag數

if flag.nflag() == 0

// 10. visit,遍歷所有在命令列中使用的flag,執行自定義函式func

flag.visit(func(f *flag.flag) )

// 11. visitall,遍歷所有註冊過的flag,執行自定義函式func

flag.visitall(func(f *flag.flag) )

// 12. 當flag -help或 -h 被呼叫但沒有註冊這個flag時,就會返回flag.usage。

// errhelp is the error returned if the -help or -h flag is invoked

}func usage()

複製**

註冊flag就是初始化這個flag

// a flag represents the state of a flag.

type flag struct

複製**

// a flagset represents a set of defined flags. the zero value of a flagset

// has no name and has continueonerror error handling.

//// flag names must be unique within a flagset. an attempt to define a flag whose

// name is already in use will cause a panic.

type flagset struct

複製**

在命令列中使用的所有flag會被解析成乙個flagset, 我們可以直接使用flag包的bool(),boolvar,parse(),nflag(),usage,visit()等函式去處理flag,這是因為flag包中已經定義了乙個flagset,名為commandline。 我們也可以用newflagset()自己定義乙個新的flagset去處理命令列flag。

區別在於,commandline會在parse()發生錯誤時退出,而newflagset()可以自定義errorhandling

// commandline is the default set of command-line flags, parsed from os.args.

// methods of commandline.

var commandline = newflagset(os.args[0], exitonerror)

複製**

// newflagset returns a new, empty flag set with the specified name and

// error handling property. if the name is not empty, it will be printed

// in the default usage message and in error messages.

func newflagset(name string, errorhandling errorhandling) *flagset

f.usage = f.defaultusage

return f

}複製**

func (f *flagset) parse(arguments string) error 

if err == nil

switch f.errorhandling

}return nil

}複製**

bool(),string(),int(),boolvar,strin**ar(),intvar(),var()都是註冊flag的方法

parse()是從命令列解析flag的方法

lookup(name string),判斷是否使用了這個flag

nflag(),返回命令列使用的flag數

visit(),按照字母順序遍歷所有在命令列使用的flag

visitall(),按照字母順序遍歷所有註冊過的flag

printdefaults(),列印所有已定義引數的預設值,預設輸出到標準錯誤。(用 visitall 實現)

只要實現 flag.value 介面即可(要求 receiver 是指標),這時候可以這樣註冊flag:

flag.var(&fla**al, "name", "help message for flagname")

複製**

// 1. 定義乙個型別,用於增加該型別方法

type slicevalue string

// 2. 實現flag包中的value介面,將命令列接收到的值用,分隔存到slice裡

func (s *slicevalue) set(val string) error

func (s *slicevalue) string() string

var sv *slicevalue

func init()

複製**

golang標準庫 time包

時間型別,包含了秒和納秒以及location type month int 月份.定義了十二個月的常量 type weekday int 周,定義了一周的七天 type duration int64 持續時間.定義了以下持續時間型別.多用於時間的加減 需要傳入duration做為引數的時候.可以直接...

Golang標準庫學習 unsafe

import unsafe unsafe包提供了一些跳過go語言型別安全限制的操作。能夠訪問底層記憶體,使用unsafe函式可以提高訪問物件的速度,但是這不是go語言推薦使用的,容易出現莫名其妙的問題,不利於擴充套件與維護。type arbitrarytype int type pointer ar...

golang中的標準庫http

go語言內建的net http包十分的優秀,提供了http客戶端和服務端的實現。基本的http https請求 get head post和postform函式發出http https請求。url.values,id 程式在使用完response後必須關閉回覆的主體。使用net http包編寫乙個簡...