生命不止,继续Go go go.
今天介绍go中的流程控制,其中包括:
if else
switch
for
goto break continue
别等了,就这三个,没有了while。
条件表达式必须是布尔类型
之前提到过,下面的代码会报错:cannot use a (type int) as type bool in assignment
a := 1
if a {
fmt.Println(a)
}
条件表达式可以省略圆括号
package main
import "fmt"
func main() {
a := 3
if (a > 2) {
fmt.Println(a)
}
}
或:
package main
import "fmt"
func main() {
a := 3
if a > 2 {
fmt.Println(a)
}
}
左侧的花括号不能另起一行
在go语言的世界中,在也不用因为if后的括号而争论左派还是右派了,下面代码错误:
package main
import "fmt"
func main() {
a := 3
if (a > 2)
{
fmt.Println(a)
}
}
错误:
a > 2 evaluated but not used
missing condition in if statement
else也不能另起一行
package main
import "fmt"
func main() {
a := 3
if (a > 2) {
fmt.Println("a > 2")
}
else {
fmt.Println("a <= 2")
}
}
错误:syntax error: unexpected else, expecting }
if else一起使用
package main
import "fmt"
func main() {
a := 3
if a > 2 {
fmt.Println("a > 2")
} else if a < 2 {
fmt.Println("a <=2")
} else {
fmt.Println("a == 2")
}
}
在if语句中进行初始化
package main
import "fmt"
func main() {
if a := 3; a > 2 {
fmt.Println("a > 2")
} else if a < 2 {
fmt.Println("a <=2")
} else {
fmt.Println("a == 2")
}
}
这里一定要注意有个分号,一定不能丢。
不需要显示的写break
package main
import "fmt"
func main() {
a, b, c, x := 1, 2, 3, 2
switch x{
case a, b:
fmt.Println("a|b")
case c:
fmt.Println("c")
default:
fmt.Println("default")
}
}
switch后的左侧花括号也不能另起一行
这里不再赘述,跟if的规则一样。
可以在switch后进行初始化
package main
import "fmt"
func main() {
switch a, b, c, x := 1, 2, 3, 2; x{
case a, b:
fmt.Println("a|b")
case c:
fmt.Println("c")
default:
fmt.Println("default")
}
}
default可以不写在case的最后,但是建议写在case的最后
下面的代码也是没毛病的,当所有case都不匹配后,才会执行default。但是建议写在最后。
package main
import "fmt"
func main() {
switch a, b, c, x := 1, 2, 3, 2; x{
default:
fmt.Println("default")
case a, b:
fmt.Println("a|b")
case c:
fmt.Println("c")
}
}
如果不想break,可以使用fallthrough关键字来向下继续执行case
package main
import "fmt"
func main() {
switch a, b, c, x := 1, 2, 3, 2; x{
default:
fmt.Println("default")
case a, b:
fmt.Println("a|b")
x += 1
fallthrough
case c:
fmt.Println("c")
}
}
输出:
a|b
c
显示使用break组织fallthrough
package main
import "fmt"
func main() {
switch a, b, c, x := 1, 2, 3, 2; x{
default:
fmt.Println("default")
case a, b:
fmt.Println("a|b")
x += 1
break
fallthrough
case c:
fmt.Println("c")
}
}
输出:
a|b
for后的表达式也可以省略圆括号
for后的花括号也不能另起一行
package main
import "fmt"
func main() {
for i, max := 0, 3; i < max; i++ {
fmt.Println(i)
}
}
使用for代替while
package main
import "fmt"
func main() {
var x int
for x < 5 {
fmt.Println(x)
x++
}
}
使用for range完成数据迭代
package main
import "fmt"
func main() {
date := [4]string{"a", "b", "c", "d"}
for i, str := range date {
fmt.Println(i, str)
}
}
输出:
0 a
1 b
2 c
3 d
最后简单介绍一下goto break continue这三个关键字。
goto
在C++中我们完全看不起goto,也禁止使用,但是在go中挺多地方使用了goto:
math/gamma.go中的代码片段:
for x < 0 {
if x > -1e-09 {
goto small
}
z = z / x
x = x + 1
}
for x < 2 {
if x < 1e-09 {
goto small
}
z = z / x
x = x + 1
}
if x == 2 {
return z
}
x = x - 2
p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6]
q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7]
return z * p / q
small:
if x == 0 {
return Inf(1)
}
return z / ((1 + Euler*x) * x)
}
break
用于switch for 等语句,终止整个语句块执行
continue
仅用于for循环,终止后续逻辑,进入下一轮循环。
原文:http://blog.csdn.net/wangshubo1989/article/details/57622109