免费外贸网站源码,返利淘网站怎么做,黑客攻击的网站,建设银行社保网站Go命令行参数操作#xff1a;os.Args、flag包 最近在写项目时#xff0c;需要用到命令行传入的参数#xff0c;正好借此机会整理一下。 1 os.Args#xff1a;程序运行时#xff0c;携带的参数#xff08;包含exe本身#xff09;
package mainimport (fmtos.Args、flag包 最近在写项目时需要用到命令行传入的参数正好借此机会整理一下。 1 os.Args程序运行时携带的参数包含exe本身
package mainimport (fmtosstrconv
)func main () {for idx, args : range os.Args {fmt.Println(参数 strconv.Itoa(idx) :, args)}
}运行之后的结果
$go run main.go 1 3 -X ?
参数0: /tmp/go-build116558042/command-line-arguments/_obj/exe/main
参数1: 1
参数2: 3
参数3: -X
参数4: ?可以看到命令行参数包括了程序路径本身以及通常意义上的参数。
程序中os.Args的类型是 []string 也就是字符串切片。所以可以在for循环的range中遍历还可以用 len(os.Args) 来获取其数量。 如果不想要输出os.Args的第一个值也就是可执行文件本身的信息可以修改上述程序 for idx, args : range os.Args[1:] {将range后面的切片去掉第一个元素。 输出切片的所有元素还有更简洁的方式
fmt.Println(strings.Join(os.Args[1:], \n))
fmt.Println(os.Args[1:])
/*
后一种方式的结果是[1 3 -X ?]这是fmt.Println输出切片的格式
*/2 flag包解析自定义参数
2.1 定义参数flag.String(name,defaultValue,usage) 使用flag包首先定义待解析命令行参数也就是以-开头的参数比如这里的 -b -s -help等。-help不需要特别指定可以自动处理。 这里指定了两个参数-b和-s var b flag.Bool(b, false, bool类型参数)
var s flag.String(s, , string类型参数)-----------------
原型
func Bool(name string, value bool, usage string) *bool
func String(name string, value string, usage string) *string通过flag.Bool和flag.String建立了2个指针b和s分别指向bool类型和string类型的变量。所以后续要通过 *b 和 *s 使用变量值。 flag.Bool和flag.String的参数有3个分别是命令行参数名称默认值提示字符串。 2.2 解析参数flag.Parse() 使用之前必须要解析否则会获取不到参数具体的值 //解析参数
flag.Parse()2.3 获取参数的值 通过*号参数名获取解析后的参数值 ①已经定义过的参数*paramName直接取值 上文已经说明通过flag方法定义好的参数变量指针通过间接引用操作即可使用其内容 fmt.Println(-b:, *b)
fmt.Println(-s:, *s)②未定义的参数:flag.Args()获取剩下参数字符切片 参数中没有能够按照预定义的参数解析的部分通过flag.Args()即可获取是一个字符串切片。 fmt.Println(其他参数, flag.Args())需要注意的是从第一个不能解析的参数开始后面的所有参数都是无法解析的。即使后面的参数中含有预定义的参数
$ go run main.go -b stop -s test others
-b: true
-s:
其他参数 [stop -s test others]2.4 案例
package mainimport (flagfmt
)func main() {var uname flag.String(username, ziyi, the user name)var age flag.Int(age, 18, the user age)flag.Parse()//①情况一带参数// ./main -username tom -age 22//解析后的结果parse after, uname tom age 22//②情况二不带参数但是因为我们定义了默认值因此参数会被赋上默认值// ./main//解析后parse after, uname ziyi age 18fmt.Println(parse after, uname, *uname, age, *age)}参考https://blog.csdn.net/guanchunsheng/article/details/79612153