第二讲 命令源码文件
此為 《極客時(shí)間&Go語言核心36講》 個(gè)人筆記,具體課程詳見極客時(shí)間官網(wǎng)。
Table of Contents generated with DocToc
- 第二講 命令源碼文件
- 1. 什么是命令源碼文件?
- 2. 命令參數(shù)的接收和解析
- 2.1 命令源碼文件怎么接收參數(shù)?
- 2.2 怎樣在運(yùn)行源代碼文件的時(shí)候傳入?yún)?shù),又怎樣查看參數(shù)的使用說明?
- 3. 補(bǔ)充
- 3.1 問題
- 3.2 其他
第二講 命令源碼文件
源碼文件分為三種:
- 命令源碼文件
- 庫源碼文件
- 測(cè)試源碼文件
1. 什么是命令源碼文件?
如果一個(gè)源碼文件聲明屬于main包,并且包含一個(gè)無參數(shù)聲明且無結(jié)果聲明的main函數(shù),那么它就是命令源碼文件。
命令源碼文件是程序的運(yùn)行入口,是每個(gè)可獨(dú)立運(yùn)行的程序必須擁有的,有且只有一個(gè)。
2. 命令參數(shù)的接收和解析
2.1 命令源碼文件怎么接收參數(shù)?
Go語言標(biāo)準(zhǔn)庫中有一個(gè)代碼包專門用于接收和解析命令參數(shù)——flag。
// func StringVar(p *string, name string, value string, usage string) {} var name string flag.StringVar(&name, "name", "zcz", "my name is ... ?") flag.Parse() fmt.Println(name)參數(shù)說明:
- p :用于存儲(chǔ)該命令參數(shù)的值的地址;
- name:參數(shù)名稱;
- value:默認(rèn)值;
- usage:該命令參數(shù)的簡(jiǎn)單描述,在打印命令說明時(shí)會(huì)用到;
flag.Parse()解析命令參數(shù)并把它們的值付給相應(yīng)的變量。對(duì)該函數(shù)的調(diào)用必須在所有命令參數(shù)存儲(chǔ)載體的聲明(如上name的聲明)和設(shè)置(如上flag.StringVar()的調(diào)用)之后,并且在讀取任何命令參數(shù)值之前進(jìn)行。
除了flag.StringVar()外,還有一個(gè)flag.String()方法,它會(huì)返回一個(gè)指向存儲(chǔ)命令參數(shù)的地址:
// func String(name string, value string, usage string) *string {} name := flag.String("name", "zcz", "my name is ... ?") flag.Parse() fmt.Println(name)2.2 怎樣在運(yùn)行源代碼文件的時(shí)候傳入?yún)?shù),又怎樣查看參數(shù)的使用說明?
傳參方式如下:
go run parameter.go -name="xxt" //output: xxt查看該命令源碼文件的參數(shù)說明:
go run parameter.go --help /* output:Usage of /var/folders/n2/m16dmxhn2mld82h_6ywcc14h0000gn/T/go-build1423020904/b001/exe/parameter:-name stringmy name is ... ? (default "zcz") */其中,/var/folders/n2/m16dmxhn2mld82h_6ywcc14h0000gn/T/go-build1423020904/b001/exe/parameter是go run命令構(gòu)建上述命令源碼文件時(shí)臨時(shí)生成的可執(zhí)行文件的完整路徑。
我們還可以:
go build parameter.go ./parameter.go --help /* output:Usage of ./parameter:-name stringmy name is ... ? (default "zcz") */3. 補(bǔ)充
3.1 問題
var name string flag.StringVar(&name, "name1", "zcz01", "my name is ... ?") flag.StringVar(&name, "name2", "zcz02", "wtf ?") flag.Parse() fmt.Println(name)- 執(zhí)行g(shù)o run parameter.go -name1="kodo" -name2="pili",輸出為:pili;
- 執(zhí)行g(shù)o run parameter.go -name2="pili" -name1="kodo",輸出為:kodo;
- 執(zhí)行g(shù)o run parameter.go -name1="kodo",輸出為:kodo;
- 執(zhí)行g(shù)o run parameter.go -name2="pili",輸出為:pili;
why?(后續(xù)解決)
3.2 其他
-
默認(rèn)情況下,我們可以讓命令源碼文件接受哪些類型的參數(shù)值?
int ( int | int64 | uint | uint64 ) ,
float ( float | float64 ) ,
string ,
bool ,
duration ( 時(shí)間 ) ,
var ( 自定義 ) -
我們可以把自定義的數(shù)據(jù)類型作為參數(shù)值的類型嗎?如果可以,怎樣做?
關(guān)鍵就是使用flag.var(),關(guān)鍵點(diǎn)在于需要實(shí)現(xiàn)flag包的Value接口。(后續(xù)會(huì)展開)
總結(jié)
以上是生活随笔為你收集整理的第二讲 命令源码文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一讲 工作区和GOPATH
- 下一篇: DDIA笔记——数据复制