### 進程參數
任何進程啟動時都可以賦予一個字符串數組作為參數,一般名為ARGV或ARGS。
通過解析這些參數可以讓你的程序更加通用,例如`cp`命令通過給定兩個參數就可以復制任意的文件,當然如果需要的參數太多最好還是使用配置文件。
### 獲得進程Argument
進程參數一般可分為兩類,一是Argument,也就是作為進程運行的實體參數。例如`cp config.yml config.yml.bak`的這兩個參數。
設計Go程序時可以輕易地獲得這些參數,argument.go代碼如下,代碼來自[https://gobyexample.com/command-line-arguments](https://gobyexample.com/command-line-arguments)。
~~~
package main
import "os"
import "fmt"
func main() {
argsWithProg := os.Args
argsWithoutProg := os.Args[1:]
arg := os.Args[3]
fmt.Println(argsWithProg)
fmt.Println(argsWithoutProg)
fmt.Println(arg)
}
~~~
運行效果如下。
~~~
$ go build command-line-arguments.go
$ ./command-line-arguments a b c d
[./command-line-arguments a b c d]
[a b c d]
c
~~~
可以看出通過`os.Args`,不管是不是實體參數都可以獲得,但是對于類似開關的輔助參數,Go提供了另一種更好的方法。
### 獲得進程Flag
使用Flag可以更容易得將命令行參數轉化成我們需要的數據類型,其中flag.go代碼如下,代碼來自[https://gobyexample.com/command-line-flags](https://gobyexample.com/command-line-flags)。
~~~
package main
import "flag"
import "fmt"
func main() {
wordPtr := flag.String("word", "foo", "a string")
numbPtr := flag.Int("numb", 42, "an int")
boolPtr := flag.Bool("fork", false, "a bool")
var svar string
flag.StringVar(&svar, "svar", "bar", "a string var")
flag.Parse()
fmt.Println("word:", *wordPtr)
fmt.Println("numb:", *numbPtr)
fmt.Println("fork:", *boolPtr)
fmt.Println("svar:", svar)
fmt.Println("tail:", flag.Args())
}
~~~
運行結果如下,相比直接使用`os.Args`代碼也簡潔了不少。
~~~
root@87096bf68cb2:/go/src# ./flag -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []
root@87096bf68cb2:/go/src# ./flag -h
Usage of ./flag:
-fork=false: a bool
-numb=42: an int
-svar="bar": a string var
-word="foo": a string
~~~
使用Go獲取進程參數是很簡單的,不過一旦參數太多,最佳實踐還是使用配置文件。
進程參數只有在啟動進程時才能賦值,如果需要在程序運行時進行交互,就需要了解進程的輸入與輸出了。
- 前言
- 致謝
- 概述
- 使用代碼
- 使用Docker
- 進程基礎
- 進程是什么
- Hello World
- PID
- PPID
- 使用PID
- 進程名字
- 進程參數
- 輸入與輸出
- 并發與并行
- 進程越多越好
- 進程狀態
- 退出碼
- 進程資源
- 死鎖
- 活鎖
- POSIX
- Nohup
- 運行進程
- Go編程實例
- 衍生新進程
- 執行外部程序
- 復制進程
- 進程進階
- 文件鎖
- 孤兒進程
- 僵尸進程
- 守護進程
- 進程間通信
- 信號
- Linux系統調用
- 文件描述符
- Epoll
- 共享內存
- Copy On Write
- Cgroups
- Namespaces
- 項目實例Run
- 項目架構
- 代碼實現
- 注意事項
- 創建目錄權限
- 捕獲SIGKILL
- Sendfile系統調用
- 后記
- 參考書籍
- 項目學習
- 再次感謝