go的命令行参数
package main import ( "fmt" "os" ) func main() { var s, sep string for i := 1; i < len(os.Args); i++ { s += sep + os.Args[i] sep = " " } fmt.Println(s) }
var声明定义了两个string类型的变量s和sep。变量会在声明时直接初始化。如果变量没有显式初始化,则被隐式地赋予其类型的零值(zero value),数值类型是0,字符串类型是空字符串""。
表示连接字符串sep和os.Args。程序中使用的语
s += sep + os.Args[i]
是一条赋值语句, 将s的旧值跟sep与os.Args[i]连接后赋值回s,等价
s = s + sep + os.Args[i]
循环索引变量i在for循环的第一部分中定义。符号 := 是短变量声明(short variabledeclaration)的一部分, 这是定义一个或多个变量并根据它们的初始值为这些变量赋予适当类型的语句。
自增语句 i++ 给 i 加1;这和 i += 1 以及 i = i + 1 都是等价的。对应的还有 i-- 给 i 减1。它们是语句,而不像C系的其它语言那样是表达式。所以 j = i++ 非法,而且++和--都只能放在变量名后面,因此 --i 也非法。
Go语言只有for循环这一种循环语句。for循环有多种形式,其中一种如下所
for initialization; condition; post { // zero or more statements }
for循环三个部分不需括号包围。大括号强制要求, 左大括号必须和post语句在同一行。initialization语句是可选的,在循环开始前执行。initalization如果存在,必须是一条简单语句(simple statement),即,短变量声明、自增语句、赋值语句或函数调用。 condition 是一个布尔表达式(boolean expression),其值在每次循环迭代开始时计算。如果为 true 则执行循环体语句。 post 语句在循环体执行结束后执行,之后再次对 condition 求值。 condition 值为 false 时,循环结束。
for循环的这三个部分每个都可以省略,如果省略 initialization 和 post ,分号也可以省略:
// a traditional "while" loop
for condition {
// ..
}
如果连 condition 也省略了,像下面这样:
// a traditional infinite loop
for {
// ..
}
这就变成一个无限循环,尽管如此,还可以用其他方式终止循环, 如一条 break 或 return 语句。
for 循环的另一种形式, 在某种数据类型的区间(range)上遍历,如字符串或切片。 上例的第二版本展示了这种形式:
// 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)
}
声明一个变量有好几种方式,下面这些都等价的:
s := ""
var s string
var s = ""
var s string = ""
如果连接涉及的数据量很大,这种方式代价高昂。一种简单且高效的解决方案是使用 strings 包的 Join 函数:
func main() {
fmt.Println(strings.Join(os.Args[1:], " ")
}
最后,如果不关心输出格式,只想看看输出值,或许只是为了调试,可以用 Println 为我们格式化输出:
fmt.Println(os.Args[1:])
这条语句的输出结果跟 strings.Join 得到的结果很像,只是被放到了一对方括号里。切片都会被打印成这种格式。