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

提示:本系列文章适合有其他语音基础并对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 中命令行参数的使用
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循环一种循环。

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,容易写对。

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连接参数

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程序,使其打印每个参数的索引和值,每个一行。

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],即被执行命令本身的名字。

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包)

//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



书籍参考:Go语言圣经中文版

文章有不足的地方欢迎在评论区指出。

欢迎收藏、点赞、提问。关注顶级饮水机管理员,除了管烧热水,有时还做点别的。

posted @ 2021-05-23 18:48  justtest1  阅读(373)  评论(1编辑  收藏  举报