## download:2020升级版系统学习Docker 践行DevOps理念
1.一個简單的hello,world!在工作區目錄下運用命令vim demo1.go,進入代码編輯形式,在其中寫入以下代码:
package main //聲明包名
import "fmt" //引入包
func main(){
fmt.Println("Hello,world!") //打印
}
保管.
運用命令go build demo1.go ,會發下在同級目錄下生成一個demo1的文件.
運用命令 ./demo1 運轉,在終端打印Hello,world!,執行勝利.
同樣,保管後也能夠直接運用命令 go run demo1.go ,也會在終端打印.
2.源码文件帶參數執行go言语規範庫中有一個代码包特地用來接纳和解析命令參數,此代码包叫做flag.
在工作區目錄下運用命令vim demo2.go,進入代码編輯形式,在其中寫入以下代码:
package main
import(
"flag"
"fmt"
)
var name string
func init(){
flag.StringVar(&name,"name","everyone","The greeting object.")
}
func main(){
flag.Parse();
fmt.Printf("Hello,%s!n",name)
}
保管.
運用命令go build demo2.go ,會發下在同級目錄下生成一個demo2的文件.
不帶參數執行:
運用命令 ./demo2 運轉,在終端打印Hello,everyone!,執行勝利.
帶參數執行:
運用命令 ./demo2 -name="jxd" 運轉,在終端打印Hello,jxd!,執行勝利.
同樣保管後也可直接運用命令 go run demo2.go -name="jxd" ,也會在終端打印.
解释:
flag.StringVar(&name,"name","everyone","The greeting object.")
第一個參數用來寄存該命令參數的地址.
第二個參數是該命令參數的稱號,執行時後面用 -name="xxx".
第三個參數是不帶參數執行時,默許打印的值.
第四個參數爲命令參數的简單阐明.
flag.Parse() 用於真正的解析參數,並把他們的值赋給相應的變量.
3. go run 和go build運用命令 go build 會在同級目錄下生成一個文件
運用命令./demo2 --help 會打印如下信息:
Usage of ./demo2:
-name string
The greeting object.(default "everyone")
運用命令 go run demo2.go --help 會打印如下信息:
Usage of /tmp/go_build577199614/boo1/exe/demo2 //構建源码文件時,暫時生成的可執行文件的完好途径
-name string
The greeting object.(default "everyone")
exit status 2
4.自定義源码文件的參數運用阐明新建demo3.go 寫入以下代码,demo3與demo2的區別在與參加了代码中红色代码局部
package main
import(
"flag"
"fmt"
"os"
)
var name string
func init(){
flag.StringVar(&name,"name","everyone","The greeting object.")
}
func main(){
flag.Usage=func(){
fmt.Fprintf(os.Stderr,"Usage of %s:n","question")
flag.PrintDefaults()
}
flag.Parse();
fmt.Printf("Hello,%s!n",name)
}
運用命令 go run demo3.go --help,發現輸出爲:
Usage of question:
-name string
The greeting object.(default "everyone")
exit status 2
與之前的輸出暫時的途径不同,這樣我們就自定義了源码文件的參數運用阐明
再深一層,我們調用flag包中一些函數的時分(StringVar,Parse),實践上是再調用flag.CommandLine的一些對應函數.
新建demo4.go,寫入以下代码,與demo2.go的區別爲红色代码局部
package main
import(
"flag"
"fmt"
"os"
)
var name string
func init(){
flag.CommandLine=flag.NewFlagSet("",flag.ExitOnError)
flag.CommandLine.Usage=func(){
fmt.Fprintf(os.Stderr,"Usage of %s:n","question")
fmt.PrintDefaults()
}
flag.StringVar(&name,"name","everyone","The greeting object.")
}
func main(){
flag.Parse();
fmt.Printf("Hello,%s!n",name)
}
運用命令 go run demo4.go --help,輸出同demo3.go一樣.
把demo4.go 中flag.CommandLine=flag.NewFlagSet("",flag.ExitOnError),修正爲 flag.CommandLine=flag.NewFlagSet("",flag.PanicOnError)後,
運用命令 go run demo4.go --help 運轉,會發現輸出又不同.
flag.ExitOnError的含義:通知命令參數容器,當命令後跟--help或者參數設置不正確時,在打印命令參數運用阐明後以狀態码2完畢當前程序.
狀態码2代表用戶錯誤的運用了命令,而flag.PanicOnError與之的區別是在最後抛出“運轉時恐慌(panic)”.
上述兩種狀況在調用flag.Parse函數時會被觸發。
新建demo5.go,寫入以下代码
package main
import(
"flag"
"fmt"
"os"
)
var name string
var cmdLine=flag.NewFlagSet("question",flag.ExitOnError)
func init(){
cmdLine.StringVar(&name,"name","everyone","The greeting object.")
}
func main(){
cmdLine.Parse(os.Args[1:]);
fmt.Printf("Hello,%s!n",name)
}
運用命令 go run demo5.go --help 運轉,也可完成自定義源码文件的參數運用阐明.
cmdLine.Parse(os.Args[1:]);指給定的命令參數
因而,這樣就完整脱離了flag.CommandLine,更靈敏的定製命令參數運用阐明,並且不會影響全局的變量flag.CommandLine.



