条件语句
package mainimport ( "fmt")func main() { // 可以初始化子语句(只能有一个表达式) if a := 25; a > 20 { fmt.Println("a大于20") } else if a < 10 { fmt.Println("a小于10") } else { fmt.Println("10<=a<=20") }}
选择语句
package mainimport ( "fmt")func main() { grade := "B" marks := 90 // 表达式switch写法1 switch marks { // 也可以switch时初始化语句,写作 switch marks := 90; marks { case 90: grade = "A" case 80: grade = "B" case 60, 70: grade = "C" default: grade = "D" } fmt.Printf("grade: %s\n", grade) // 表达式switch写法2 switch { // 也可以switch时初始化语句,写作 switch marks := 90; { case marks >= 90: grade = "A" case marks >= 80: grade = "B" case marks >= 70: grade = "C" case marks >= 60: grade = "D" default: grade = "E" } fmt.Printf("grade: %s\n", grade) // 表达式switch写法3-1 switch { case grade == "A": fmt.Println("成绩优秀") case grade == "B": fmt.Println("表现良好") case grade == "C", grade == "D": // case 表达式可以有多个 fmt.Println("再接再厉") default: fmt.Println("成绩不合格") } // 表达式switch写法3-2 switch { case grade == "A": fmt.Println("成绩优秀") case grade == "B": fmt.Println("表现良好") case grade == "C": fallthrough // 同3-1,将两个表达式写一起 case grade == "D": fmt.Println("再接再厉") default: fmt.Println("成绩不合格") } // 类型switch写法 x = "1" switch i := x.(type) { case nil: fmt.Printf("i: %T\n", i) case int: fmt.Printf("i: %T\n", i) case float64: fmt.Printf("i: %T\n", i) case bool: fmt.Printf("i: %T\n", i) case string: fmt.Printf("i: %T\n", i) default: fmt.Printf("未知类型") } // select 语句 a := make(chan int, 1024) b := make(chan int, 1024) for i := 0; i < 10; i++ { fmt.Printf("第%d次", i) a <- 1 b <- 1 select { case <-a: fmt.Println("from a") case <-b: fmt.Println("from b") } }}var x interface{} // 空接口
循环语句
package mainimport ( "fmt")func main() { for a := 0; a < 5; a++ { fmt.Printf("a: %v\n", a) } a := 0 b := 5 for a < b { fmt.Printf("a: %v\n", a) a++ } /* 每一个for语句都可以使用一个特殊的range子语句,其作用类似迭代器可以轮询 1. 数组或切片值中的每一个元素 2. 字符串的每一个字符 3. 字典值中的每个键值对 4. 持续读取通道类型值中的元素 具体参考代码块后的表格 */ str := "abcd" for i, char := range str { fmt.Printf("字符串第%d个字符的值为%d\n", i, char) } for _, char := range str { // 忽略第1个参数 fmt.Println(char) } for i := range str { // 忽略第2个参数 fmt.Println(i) } for range str { // 忽略所有参数,只执行下面的代码块 fmt.Println("执行成功") }}
| 右边表达式返回的类型 |
第一个值 |
第二个值 |
| string |
index |
str[index], 返回类型为rune |
| array/slice |
index |
str[index] |
| map |
key |
m[key] |
| channel |
element |
延迟语句
package mainimport ( "fmt")// 先输出 Hello 再输出worldfunc main() { defer fmt.Println("world") fmt.Println("Hello")}/* defer用于延迟调用指定函数 defer只能出现在函数内部 defer后的表达式必须是外部函数的调用 defer语句全部执行完毕,defer所在函数才算真正结束执行,才会执行return语句 defer延迟特点可以用来回收资源、清理收尾等工作。使用defer语句之后,不用纠结回收代码放哪里,反正都是最后执行*/
package mainimport ( "fmt")var i = 0func print() { fmt.Println(i)}/*输出 5 5 5 5 5解释 defer在函数轮询之后执行,此时i为5*/func main() { for ; i < 5; i++ { defer print() }}
package mainimport ( "fmt")var i = 0func print(i int) { fmt.Println(i)}/*输出 4 3 2 1 0解释 defer 压栈是携带i值 */func main() { for ; i < 5; i++ { defer print(i) }}
标签
package mainimport ( "fmt")func main() {LOOP1: for { x := 2 switch { case x == 0: fmt.Println("A") break LOOP1 case x == 1: fmt.Println("B") continue LOOP1 case x == 2: fmt.Println("C") goto BREAK default: fmt.Println("C") } }BREAK: println("break")}