Go语言中我必须掌握三大流程控制语句
- 顺序控制
- 分支控制
- 循环控制
1. 顺序控制
简单理解就是按代码编写的顺序逐行执行,程序代码中没有任何的判断和跳转
2. 分子控制
2.1 单分支控制
if 条件表达式 {
逻辑代码块
}
package main
import "fmt"
func main() {
var age int = 20
if(age > 18) {
fmt.Println("你已是成年人了!")
}
}
- golang 中支持在if表达式中直接定义变量
// 此时 if 后的条件表达式是不能加 () 的,否则编译报错
if age := 20; age > 18 {
fmt.Println("你已是成年人了!")
}
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
}
return lim
}
2.2 双分支控制
if 条件表达式 {
逻辑代码块1
} else {
逻辑代码块2
}
2.3 使用细节
if else必须有大括号{},不然编译报错
func main() {
var age int = 20
// 编译报错:syntax error: unexpected newline, expecting { after if clause
if(age > 18)
fmt.Println("你已是成年人了!")
else
fmt.Println("你还小!")
}
if else中的else不能换行,不然编译报错
func main() {
var age int = 20
if(age > 18) {
fmt.Println("你已是成年人了!")
}
// syntax error: unexpected else, expecting }
else {
fmt.Println("你还小!")
}
}
2.4 switch分支
- 与
java中不同的就是case后面不需要加break关键字 switch的穿透fallthrought,如果在case语句块后面加fallthrough,则会继续执行下一个case
package main
import "fmt"
func main() {
var a int = 10
switch a {
case 10 :
fmt.Println(10)
fallthrough
case 20 :
fmt.Println(20)
case 30 :
fmt.Println(40)
default :
fmt.Println("no match")
}
}
- Type Switch
switch语句还可以被用Type Switch来判断某个interface变量中实际指向的变量类型
package main
import "fmt"
func main() {
var x interface{}
var y = 10.0
x = y
switch i := x.(type) {
case nil :
fmt.Printf("x 的类型:%T\n",i)
case int :
fmt.Printf("x 是int类型\n")
case float64 :
fmt.Printf("x 是float64类型\n")
default :
fmt.Printf("未知类型\n")
}
}
3. 循环控制
3.1 for 循环
golang 中 for 的几种写法,和 Java 中有所不同,for 后面的循环条件不需要加 ()
- 形式一
package main
import "fmt"
func main() {
for j := 1; j <= 10; j++ {
fmt.Printf("j=%v\n", j)
}
}
- 形式二
package main
import "fmt"
func main() {
j := 1
for j <= 10 {
fmt.Printf("j=%v\n", j)
j++
}
}
- golang 提供
for-range的方式,方便遍历字符串和数组
package main
import "fmt"
func main() {
var str string = "Beijing 欢迎你"
// 注意:这里如果你不想要 index 的值,则可以 for _,val := range str{}
for index, val := range str {
fmt.Printf("index=%v, value=%c\n",index, val)
}
}
注意:对于字符串的变量不推荐使用传统的下标方式来遍历,因为遇到中文字符串时会乱码。因为下标的遍历方式是按照字节来遍历的,而一个汉字对应3个字节,把带有汉字的字符串转换成切片,然后遍历。
package main
import "fmt"
func main() {
var str string = "Beijing 欢迎你"
str2 := []rune(str)
for i := 0; i < len(str2); i++ {
fmt.Printf("i=%v, value=%c\n",i, str2[i])
}
}
3.2 while 和 do ... while 循环
在golang语言中没有 这两种语法 !!!需要特别注意。但是可以通过 for 循环来实现它们的循环效果
for循环实现while循环的功能
package main
import "fmt"
func main() {
var i int = 1
for {
// 循环结束条件
if(i > 3) {
break
}
fmt.Printf("i=%v\n",i)
i++
}
}
for循环实现do ... while循环的功能
package main
import "fmt"
func main() {
var j int = 1
for {
fmt.Printf("j=%v\n",j)
j++
// 循环结束条件
if(j > 3) {
break
}
}
}
4. continue、break 和 return
这三个关键字的使用和Java语言一样
continue:跳过本次循环,继续执行下一次循环break:跳出当前循环,继续执行当前循环以外的逻辑代码return:使用在方法或者函数中,表示跳出所在的方法或者函数(也就是方法或函数的逻辑结束)