Go语言 -- 获取命令行参数
部署golang项目时难免要通过命令行来设置一些参数,那么在golang中如何操作命令行参数呢?可以使用flag库和os库。
1.flag库的使用
Go语言标准库提供了用于快迅解析命令行参数的flag包,大致的使用步骤如下:
a.通过flag.String(), flag.Bool(), flag.Int()等方式来定义命令行中需要使用的参数。
b.在定义完flag后,通过调用flag.Parse()来进行对命令行参数的解析。
c.获取flag.String(), flag.Bool(), flag.Int()等方法的返回值,即对应用户输入的参数.
需要注意的是flag.Xxx()返回的值是变量的内存地址,要获取值时要通过在变量前加*(星号)获取.
说明:
像flag.Int、flag.Bool、flag.String这样的函数格式都是一样的,调用的时候需要传入3个参数
参数的说明如下:
第一个arg表示参数名称,在控制台的时候,提供给用户使用.
第二个arg表示默认值,如果用户在控制台没有给该参数赋值的话,就会使用该默认值.
第三个arg表示使用说明和描述,在控制台中输入-arg的时候会显示该说明,类似-help
看个完整的使用例子:
package main
import (
"flag"
"fmt"
)
func main() {
married := flag.Bool("married", false, "Are you married?")
age := flag.Int("age", 22, "How old are you?")
name := flag.String("name", "", "What your name?")
var address string
//flag.StringVar这样的函数第一个参数换成了变量地址,后面的参数和flag.String是一样的。
flag.StringVar(&address, "address", "GuangZhou", "Where is your address?")
flag.Parse() //解析输入的参数
fmt.Println("输出的参数married的值是:", *married)//不加*号的话,输出的是内存地址
fmt.Println("输出的参数age的值是:", *age)
fmt.Println("输出的参数name的值是:", *name)
fmt.Println("输出的参数address的值是:", address)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
运行结果:
这里写图片描述
从运行结果中可以看出,address参数我们并没有指定值,则输出的就是默认值.
另外,-arg后面的=号也不是必须的,可以用空格代替.
如果要查看该程序的所有参数的使用,可以使用-help来查看,如下:
这里写图片描述
2.os库的使用
直接看例子
package main
import (
"os"
"fmt"
)
func main() {
args := os.Args //获取用户输入的所有参数
if args == nil || len(args) <2{
Usage()//如果用户没有输入,或参数个数不够,则调用该函数提示用户
return
}
name := args[1] //获取输入的第一个参数
age := args[2] //获取输入的第二个参数
fmt.Println("your name is:",name,"\nyour age is:",age)
}
var Usage = func() {
fmt.Println("you name?");
fmt.Println("you age?");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
运行结果:
这里写图片描述
个人感觉还是flag获取参数好用一点,因为flag更贴切参数的用法,而且可以查看详情.
最后补充下如何获取变量的内存地址和接收方式
package main
import (
"fmt"
)
func main() {
var name string = "abc"
var nameAddress *string = &name; //如果要接收变量的内存地址,变量对应的类型前要加*号
fmt.Println("name变量的内存地址:",&name)
fmt.Println("nameAddress的值:",nameAddress)
fmt.Println("&name==nameAddress? ",&name == nameAddress)
fmt.Println("nameAddress对应变量的值: ",*nameAddress)//内存地址前加*号则可以看到对应的值了.
fmt.Println("name变量的值: ",*&*&name)//*号和&可以多次组合来使用,阅读的时候从右往左
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
运行结果:
这里写图片描述
[理论]
&符号的意思是对变量取地址,如:变量a的地址是&a
*符号的意思是对指针取值,如:*&a,就是a变量所在地址的值,当然也就是a的值了
1
2
1
2
[简单的解释]
*和 & 可以互相抵消,同时注意,*&可以抵消掉,但&*是不可以抵消的
a和*&a是一样的,都是a的值,值为1 (因为*&互相抵消掉了)
同理,a和*&*&*&*&a是一样的,都是1 (因为4个*&互相抵消掉了)
Go语言 -- 获取命令行参数的更多相关文章
- Go语言获取命令行参数
package main import ( "os" "fmt" ) func main() { args := os.Args //获取用户输入的所有参数 { ...
- go语言基础之获取命令行参数
1.获取命令行参数 示例: package main //必须 import "fmt" import "os" func main() { list := o ...
- C程序获取命令行参数
命令行参数 命令行界面中,可执行文件可以在键入命令的同一行中获取参数用于具体的执行命令.无论是Python.Java还是C等等,这些语言都能够获取命令行参数(Command-line argument ...
- 【WPF】如何获取命令行参数
应用程序以 Main 方法为入口点,如果为 Main 方法指定一个 string[] 类型的参数,在程序运行时,这个参数会获取到传递给应用程序的命令行参数. 而 WPF 应用程序比较特殊,因为在VS中 ...
- 从Win32程序中的主函数中获取命令行参数
在标准C或者Win32控制台程序的main函数中,它们都有两个参数:"argc" 和 "argv",如下所示: int main(int argc, char ...
- golang获取命令行参数
部署golang项目时难免要通过命令行来设置一些参数,那么在golang中如何操作命令行参数呢?可以使用os库和flag库. 1.golang os库获取命令行参数 os可以通过变量Args来获取命令 ...
- 【Python学习 】Python获取命令行参数的方法
背景 最近编写一个python程序的时候,需要去获取python命令行的参数,因此这里记录下如何获取命令行参数的方法. 一.sys 模块 在 Python 中,sys 模块是一个非常常用且十分重要的模 ...
- python获取命令行参数的方法(汇总)
介绍python获取命令行参数的方法:getopt模和argparse模块. python版本:2.7 一.getopt模块 主要用到了模块中的函数: options, args = getopt.g ...
- MFC中获取命令行参数的几种方法
在MFC程序中,可以用以下几种方法来获取命令行参数. 为方便说明,我们假设执行了命令:C:\test\app.exe -1 -2 方法一 ::GetCommandLine(); 将获取到 " ...
随机推荐
- BZOJ 5336: [TJOI2018]party
状压最长公共子序列的DP数组,一维最多K(15)个数,且相邻两个数的差不超过1,2^15种状态,预处理转移 #include<cstdio> #include<algorithm&g ...
- HDU 5525 Product 数论
题意: 给出一个长度为\(n(1 \leq n \leq 10^5)\)的序列\(A_i\),\(N=\prod\limits_{i=1}^{n}i^{A_i}\).求\(N\)的所有约数的乘积. 分 ...
- SPOJ 375 树链剖分 QTREE - Query on a tree
人生第一道树链剖分的题目,其实树链剖分并不是特别难. 思想就是把树剖成一些轻链和重链,轻链比较少可以直接修改,重链比较长,用线段树去维护. 貌似大家都是从这篇博客上学的. #include <c ...
- Linux内存cache/buffer剖析
查询linux系统中空闲内存/内存使用状态查看/剩余内存查看 如何计算内存的使用量及空闲量 物理已用内存 = 实际已用内存 - 缓冲 - 缓存 = 24752 - 283 ...
- 转:模式窗口showModalDialog的用法总结
模式窗口showModalDialog的用法总结 最近几天一直在处理模式窗口的问题,索性写了这篇总结,以供参考: 1.打开窗口:var handle = window.showModalDialo ...
- [整理]菜鸟教程:docker使用笔记
- docker # 查看 docker stats 指令的具体使用方法 - docker stats --help # 运行一个web应用 - docker pull training/webapp ...
- DS博客作业05--树
1.本周学习总结 1.思维导图 2.谈谈你对树结构的认识及学习体会 学完树之后,最大的感觉就是在处理节点之间的兄弟父亲关系的时候真的挺好用的,一目了然.不过,树令人比较头疼的就是要用递归,大致能懂递归 ...
- JQUERY杂技
JQUERY小技巧 this.value jsobject.val() #aaa:eq(2) 选择第三个id为aaa的元素 $("input")只选择input标签.如:<i ...
- 【Luogu】P3157动态逆序对(树状数组套主席树)
题目链接 md第一道在NOILinux 下用vim做的紫题.由于我对这个操作系统不是很熟悉,似乎有什么地方搞错了,md调死.(我还打了两遍代码,调了两个小时) 但是这道题并不难,就是树状数组套上主席树 ...
- [AtCoderContest075F]Mirrored
[AtCoderContest075F]Mirrored 试题描述 For a positive integer \(n\), we denote the integer obtained by re ...