Go中只有少量几个控制结构
if - else
Go的if-else看起来是这样的:
if x > 0 {
return y
}
else {
return x
}
大括号是强制要加的,这样做的目的是使代码看起来更清晰。这也是一个好的编程习惯
if 和switch接受初始化语句,通常用来初始化一个局部变量
//在Go中大括号与if必须在同一行
if err:=Chmod(0664); err != nil {
fmt.Print(err)
return err
}
在Go库中,当一个if语句不会进入下一个语句流程- 当语句结束于continue,break,goto或return时 - 不必要的else会被省略
f,err := os.Open(name, os.RDONLY, 0)
if err != nil {
return err
}
doSomething(f)
goto 语句,goto语句的标签名是大小写敏感的
for循环,3种形式
for init;condition;post {
}
for condition {
}
for { //死循环
}
sum := 0
for i:=0; i<10; i++ {
sum += i
}
Go中不支持逗号表达式,++ 和 - 是语句和表达式,如果你想在循环中使用多个变量,应该使用平行赋值
for i,j = 0, len(a)-1; i < j; i,j = i+1,j-1 {
a[i], a[j] = a[j], a[i]
}
break 和 continue
利用break可以提前终止循环
for i:=0; i < 10;i ++ {
if i==8 {
break;
}
fmt.Println(i)
}
嵌套循环中,可以在break后面指定标签,决定跳出哪一层循环
J:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 3 {
break J
}
fmt.Println(i * j)
}
}
利用continue让循环进入下一个迭代,略过剩下的代码。
for i := 0; i < 10; i++ {
if i == 5 {
continue
}
fmt.Println(i)
}
range关键字可用于循环。用作迭代器。当被调用时,它从循环中返回一个键值对。
list := []string{"1", "2", "s", "haha"}
for k, v := range list {
fmt.Printf("%v = %s\n", k, v)
}
for pos, char := range "ab中" {
fmt.Printf("%d = %c\n", pos, char)
}
switch, Go中的switch非常强大。表达式不必式常量或整数,执行过程从上而下,直到找到匹配项,而如果switch没有表达式,它会匹配true,这产生一种可能,可以用switch编写 if - else if -else的表达式
i := 11
switch {
case i < 10:
fmt.Println("less than 10")
break
case i == 10:
fmt.Println("eq 10")
break
case i > 10:
fmt.Println("more than 10")
break
}
它不会匹配失败后自动往下匹配,但是可以用fallthrough使其这样做,实际在go1.8中测试,加不加fallthrough都可以实现相同额功能
i := 10
switch i {
case 11:
fallthrough
case 10:
fmt.Println("Balabala")
case 12:
fmt.Println("more than 10")
}
分支可以使用逗号分隔的列表
func shouldEscape(c byte) bool {
switch c {
case ' ', '?', '&', '=', '#', '+':
return true
}
return false
}
//比较两个字符数组的大小
func compare(a, b []byte) int {
for i := 0; i < len(a) && i < len(b); i++ {
switch {
case a[i] > b[i]:
return 1
case a[i] < b[i]:
return -1
}
}
switch {
case len(a) > len(b):
return 1
case len(b) > len(a):
return -1
}
return 0
}