# Go 命令行參數標記
命令行參數標記是為命令行程序指定選項參數的常用方法。例如,在命令`wc -l`中,`-l`就是一個命令行參數標記。
Go提供了`flag`包來支持基本的命令行標記解析。我們這里將要使用這個包提供的方法來實現帶選項的命令行程序。
```go
package main
import "flag"
import "fmt"
func main() {
// 基礎的標記聲明適用于string,integer和bool型選項。
// 這里我們定義了一個標記`word`,默認值為`foo`和一
// 個簡短的描述。`flag.String`函數返回一個字符串指
// 針(而不是一個字符串值),我們下面將演示如何使
// 用這個指針
wordPtr := flag.String("word", "foo", "a string")
// 這里定義了兩個標記,一個`numb`,另一個是`fork`,
// 使用和上面定義`word`標記相似的方法
numbPtr := flag.Int("numb", 42, "an int")
boolPtr := flag.Bool("fork", false, "a bool")
// 你也可以程序中任意地方定義的變量來定義選項,只
// 需要把該變量的地址傳遞給flag聲明函數即可
var svar string
flag.StringVar(&svar, "svar", "bar", "a string var")
// 當所有的flag聲明完成后,使用`flag.Parse()`來分
// 解命令行選項
flag.Parse()
// 這里我們僅僅輸出解析后的選項和任何緊跟著的位置
// 參數,注意我們需要使用`*wordPtr`的方式來獲取最
// 后的選項值
fmt.Println("word:", *wordPtr)
fmt.Println("numb:", *numbPtr)
fmt.Println("fork:", *boolPtr)
fmt.Println("svar:", svar)
fmt.Println("tail:", flag.Args())
}
```
為了運行示例,你需要先將程序編譯為可執行文件。
```
go build command-line-flags.go
```
下面分別看看給予該命令行程序不同選項參數的例子:
(1) 給所有的選項設置一個參數
```
$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []
```
(2) 如果你不設置flag,那么它們自動采用默認的值
```
$ ./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []
```
(3) 尾部的位置參數可以出現在任意一個flag后面
```
$ ./command-line-flags -word=opt a1 a2 a3
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3]
```
(4) 注意flag包要求所有的flag都必須出現在尾部位置參數的前面,否則這些flag將被當作位置參數處理
```
$ ./command-line-flags -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
trailing: [a1 a2 a3 -numb=7]
```
(5) 使用`-h`或者`--help`這兩個flag來自動地生成命令行程序的幫助信息
```
$ ./command-line-flags -h
Usage of ./command-line-flags:
-fork=false: a bool
-numb=42: an int
-svar="bar": a string var
-word="foo": a string
```
(6) 如果你提供了一個程序不支持的flag,那么程序會打印一個錯誤信息和幫助信息
```
$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./go_cmd_flag:
-fork=false: a bool
-numb=42: an int
-svar="bar": a string var
-word="foo": a string
```
- 版權
- 內容
- Go常量
- Go變量
- Go 數值
- Go 數組
- Go 字典
- Go 函數定義
- Go 方法
- Go 結構體
- Go 閉包函數
- Go 接口
- Go 字符串操作函數
- Go 字符串格式化
- Go 自定義排序
- Go Base64編碼
- Go Defer
- Go Exit.md
- Go for循環
- Go if..else if..else 條件判斷
- Go JSON支持
- Go Line Filters
- Go 狀態協程
- Go Panic
- Go range函數
- Go SHA1 散列
- Go String與Byte切片之間的轉換
- Go Switch語句
- Go URL解析
- Go 遍歷通道
- Go 并行功能
- Go 并行通道Channel
- Go 超時
- Go 錯誤處理
- Go 打點器
- Go 遞歸函數
- Go 讀取文件
- Go 工作池
- Go 關閉通道
- Go 函數多返回值
- Go 函數回調
- Go 函數命名返回值
- Go 互斥
- Go 環境變量
- Go 集合功能
- Go 計時器
- Go 進程觸發
- Go 進程執行
- Go hello world
- Go 可變長參數列表
- Go 命令行參數
- Go 命令行參數標記
- Go 排序
- Go 切片
- Go 請求處理頻率控制
- Go 時間
- Go 時間戳
- Go 時間格式化和解析
- Go 數字解析
- Go 隨機數
- Go 通道的同步功能
- Go 通道方向
- Go 通道緩沖
- Go 通道選擇Select
- Go 寫入文件
- Go 信號處理
- Go 原子計數器
- Go 正則表達式
- Go 指針