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包編寫乙個簡...