### 进程参数
任何进程启动时都可以赋予一个字符串数组作为参数,一般名为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系统调用
- 后记
- 参考书籍
- 项目学习
- 再次感谢