if语句
i f x > 0 { // {是强制的,且必须和if在同一行
return y
} else {
return x
}
if 和 switch 接受初始化语句,通常用于设置一个(局部)变量。
if err := Chmod(0664); err != nil { //nil 与 C 的 NULL 类似
fmt.Printf(err) //err 的作用域被限定在 if 内
return err
}
goto语句
用 goto 跳转到一定是当前函数内定义的标签
func myfunc() {
i := 0
Here: // 这行的第一个词,以分号结束作为标签,标签名区分大小写
println(i)
i++
goto Here // 跳转
}
for语句
Go 的 for 循环有三种形式,只有其中的一种使用分号。
for init; condition; post { } // 和C的for一样
for condition {} // 和while一样
for {} // 死循环
1、
sum := 0
for i:=0; i<10; i++ {
sum+=i ←sum = sum + i 的简化写法 }
2、
for i,j:=0, len(a)-1; i
break和continue
利用 break 可以提前退出循环,break 终止当前的循环。
for i:=0; i<10; i++ {
if i>5{
break //终止这个循环,只打印 0 到 5
}
println(i)
}
循环嵌套循环时,可以在 break 后指定标签。用标签决定哪个循环被终止:
J: for j:=0; j<5; j++ {
for i:=0; i<10; i++ {
if i>5{
break J // 现在种植的是j循环,而不是i的那个
}
println(i)
}
}
利用 continue 让循环进入下一个迭代,而略过剩下的所有代码。下面循环打印了 0 到 5。
for i:=0; i<10; i++ {
if i>5{
continue // 跳过循环中所有的代码println(i)
}
println(i)
}
range
range可用于循环,支持slice、array、string、map和channel,range 是个迭代器,当被调用的时候,从它循环的内容中返回一个键值对。基于 不同的内容,range 返回不同的东西。
// 遍历array
list := []string {"a", "b", "c", "d", "e", "f"}
for k, v := range list {
// k,v键值对:k为key,v为value
}
// 遍历字符串
for pos, char := range "aΦx" {
fmt.Printf("character '%c' starts at byte position %d\n",char, pos)
}
switch语句
Go 的 switch 非常灵活。表达式不必是常量或整数,执行的过程从上至下,直到找到匹 配项,而如果 switch 没有表达式,它会匹配 true 。这产生一种可能——使用 switch 编写 if-else-if-else 判断序列。
func unhex(c byte) byte {
switch {
case '0'<=c&&c<='9': return c - '0'
case 'a'<=c&&c<='f': return c - 'a' + 10
case 'A'<=c&&c<='F': return c - 'A' + 10
}
return 0
}
它不会匹配失败后自动向下尝试,但是可以使用 fallthrough 使其这样做。没 有 fallthrough:
switch i {
case 0: // 空的case体
case 1:
f() // 当i==0时,f不会被调用!
}
而这样:
switch i {
case 0: fallthrough
case 1:
f() // 当i==0时,f会被调用!
}
用 default 可以指定当其他所有分支都不匹配的时候的行为。
switch i {
case 0:
case 1:
f()
default:
g() //当i不等于0或1时调用
}
分支可以使用逗号分隔的列表。
func shouldEscape(c byte) bool {
switch c {
case ' ', '?', '&', '=', '#', '+': // ,或者 “or”都可以
return true
}
return false
}
使用 switch 对字节数组进行比较的例子:
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 { 1
case len(a) < len(b):
return -1
case len(a) > len(b):
return 1
}
return 0
}