golang快速入门(二)初尝命令行参数

zhangxiaohai · · 1098 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

**提示:本系列文章适合有其他语音基础并对Go有持续冲动的读者** ### 一、package介绍 ​ Go语言的代码是通过package来组织的,package的概念和你知道的其它语言 里的libraries或者modules概念比较类似。 ​ 一个package会包含一个或多个.go结束的源代码文件。每一 个源文件都是以一个package xxx的声明语句开头的,比如我们的例子里就是package main。这行声明语 句表示该文件是属于哪一个package,紧跟着是一系列import的package名,表示这个文件中引入的 package。再之后是本文件本身的代码。 ​ package main是一个比较特殊的package。这个package里会定义一个独立的程序,这个程序是可以运行 的,而不是像其它package一样对应一个library。 ​ 这也正是因为go语言必须引入所有要用到的package的原则,假如你没有在代码里import需要用到的 package,程序将无法编译通过,同时当你import了没有用到的package,也会无法编译通过。 ### 二、命令行参数 ​ os这个package提供了操作系统无关(跨平台)的,与系统交互的一些函数和相关的变量,运行时程序的 命令行参数可以通过os包中一个叫Args的变量来获取;当在os包外部使用该变量时,需要用os.Args来访问。 os.Args的第一个元素,即os.Args[0]是命令行执行时的命令本身;其它的元素则是执行该命令时传给这 个程序的参数。前面提到的切片表达式,s[m:n]会返回第m到第n-1个元素,所以下一个例子里需要用到 的os.Args[1:len(os.Args)]即是除了命令本身外的所有传入参数。如果我们省略s[m:n]里的m和n,那么 默认这个表达式会填入0:len(s),所以这里我们还可以省略掉n,写成os.Args[1:]。 ##### 1.输出命令行参数 ```go // go 中命令行参数的使用 package main import ( "fmt" "os" ) func main() { var s, seq string seq = " " for i := 1; i < len(os.Args); i++ { s += os.Args[i] + seq } fmt.Println(s) } [root@VM-0-5-centos course1]# go run lesson-1.go hello world hello world ``` --- ##### 2.关于循环 **在Go语言里只有`for循环`一种循环。** ```go for initialization; condition; post { // zero or more statements } // a traditional "while" loop for condition { // ... } // a traditional infinite loop for { // ... } ``` **range** 每次循环迭代,`range`产生一对值;索引以及在该索引处的元素值。这个例子不需要索引,但`range`的语法要求, 要处理元素, 必须处理索引。一种思路是把索引赋值给一个临时变量, 如`temp`, 然后忽略它的值,但Go语言不允许使用无用的局部变量(local variables),因为这会导致编译错误。 Go语言中这种情况的解决方法是用`空标识符`(blank identifier),即`_`(也就是下划线)。空标识符可用于任何语法需要变量名但程序逻辑不需要的时候, 例如, 在循环里,丢弃不需要的循环索引, 保留元素值。大多数的Go程序员都会像上面这样使用`range`和`_`写`echo`程序,因为隐式地而非显式地索引os.Args,容易写对。 ```go package main import ( "fmt" "os" ) func main() { var s string seq := " " for _, arg := range os.Args[1:] { s += arg + seq } fmt.Println(s) } ``` **strings.Join**连接参数 ```go package main import ( "fmt" "os" "strings" ) func main() { var s string s = strings.Join(os.Args[1:], " ") fmt.Println(s) fmt.Println(os.Args[1:]) //切片的方式输出 } [root@VM-0-5-centos course1]# go run join.go wo apple ibm cisco wo apple ibm cisco [wo apple ibm cisco] ``` ### 三、 练习 **练习 1.1:** 修改`echo`程序,使其打印每个参数的索引和值,每个一行。 ```go package main import ( "fmt" "os" ) func main() { var s string seq := " " for index, arg := range os.Args[1:] { s += arg + seq //fmt.Println("yees" + s) fmt.Println(index, arg) } //fmt.Println(s) } ``` **练习 1.2:** 修改`echo`程序,使其能够打印`os.Args[0]`,即被执行命令本身的名字。 ```go package main import ( "fmt" "os" ) func main() { var s string seq := " " for index, arg := range os.Args[1:] { s += arg + seq //fmt.Println("yees" + s) fmt.Println(index, arg) } fmt.Println(os.Args[0]) } //output [root@VM-0-5-centos course1]# go run for_range.go apple ibm 0 apple 1 ibm /tmp/go-build844979177/b001/exe/for_range ``` **练习 1.3:** 做实验测量潜在低效的版本和使用了`strings.Join`的版本的运行时间差异。(time包) ```go //for循环遍历 package main import ( "fmt" "os" "time" ) func main() { var s, seq string seq = " " var start_time = time.Now() for i := 1; i < len(os.Args); i++ { s += os.Args[i] + seq } fmt.Println(s) end_time := time.Now() fmt.Println(end_time.Sub(start_time)) } [root@VM-0-5-centos course1]# go run comandline.go apple ibm apple ibm 19.667µs //join连接 package main import ( "fmt" "os" "strings" "time" ) func main() { var s string start_time := time.Now() s = strings.Join(os.Args[1:], " ") fmt.Println(s) //fmt.Println(os.Args[1:]) end_time := time.Now() fmt.Println(end_time.Sub(start_time)) } [root@VM-0-5-centos course1]# go run join.go apple ibm apple ibm 16.782µs ``` --- 公众号【容器云实践】 [golang快速入门(二)初尝命令行参数](https://mp.weixin.qq.com/s?__biz=MzkzNjEwNTMyNA==&mid=2247483661&idx=1&sn=b3fab5c19b1c6114efa7ef56b11a2371&chksm=c2a2850ef5d50c18153aa284d340bc8400448d13c0a863c97b4156593691846fc7764d1de937&token=1931167070&lang=zh_CN#rd)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1098 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传