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.