命令行参数
os 包以跨平台的方式,提供了一些与操作系统交互的函数和变量。程序的命令行参数可从os 包的Args变量获取;os包外部使用os.Args访问该变量。
os.Args变量是一个字符串(string)的切片(slice)。
os.Args的第一个元素,os.Args[0], 是命令本身的名字;其它的元素则是程序启动时传给它的 参数。s[m:n]形式的切片表达式,产生从第m个元素到第n-1个元素的切片,如果省略切片表达式的m或n,会默认传入0或 len(s)。
变量与声明
var 声明定义变量,变量会在声明时直接初始化。如果变量没有显 式初始化,则被隐式地赋予其类型的零值(zero value),数值类型是0,字符串类型是空字 符串”“。
符号 := 是短变量声明(short variable declaration) 的一部分, 这是定义一个或多个变量并根据它们的初始值为这些变量赋予适当类 型的语句。
运算
对 string 类型, + 运算符连接字符串
自增语句i++ 给i 加1;这和i += 1 以及i = i + 1 都是等价的。对应的还有i– 给i 减 1。它们是语句,而不像C系的其它语言那样是表达式。所以 j = i++ 非法,而且++和–都只 能放在变量名后面,因此 –i 也非法。
循环
1
2
3
for initialization; condition; post {
// zero or more statements
}
initialization 语句是可选的,在循环开始前执行。initalization 如果存在,必须是一条简单语句 (simple statement),即,短变量声明、自增语句、赋值语句或函数调用。 condition 是一个布尔表达式(boolean expression),其值在每次循环迭代开始时计算。如果为 true 则执行循环体语句。 post 语句在循环体执行结束后执行,之后再次对 condition 求值。 condition 值为 false 时,循环结束。
for循环的这三个部分每个都可以省略,如果省略 initialization 和 post ,分号也可以省略:
1
2
3
// a traditional "while" loop
for condition { // ...
}
如果连 condition 也省略了,像下面这样:
1
2
3
4
// a traditional infinite loop
for {
// ...
}
这就变成一个无限循环,尽管如此,还可以用其他方式终止循环, 如一条 break 或 return 语 句。
for 循环的另一种形式, 在某种数据类型的区间(range)上遍历,如字符串或切片。 echo 的第二版本展示了这种形式:
1
2
3
4
5
6
7
8
9
10
11
12
13
// Echo2 prints its command-line arguments.
package main
import (
"fmt"
"os"
)
func main() {
s, sep := "", ""
for _, arg := range os.Args[1:] {
s += sep + arg
sep = " " }
fmt.Println(s)
}
每次循环迭代, range 产生一对值;索引以及在该索引处的元素值。这个例子不需要索引, 但 range 的语法要求, 要处理元素, 必须处理索引。一种思路是把索引赋值给一个临时变量, 如 temp , 然后忽略它的值,但Go语言不允许使用无用的局部变量(local variables),因为这 会导致编译错误。
Go语言中这种情况的解决方法是用 空标识符 (blank identifier),即 (也就是下划线)。 空标识符可用于任何语法需要变量名但程序逻辑不需要的时候, 例如, 在循环里,丢弃不需要 的循环索引, 保留元素值。大多数的Go程序员都会像上面这样使用 range 和 写 echo 程 序,因为隐式地而非显式地索引os.Args,容易写对。