主要内容
Go语言规定与if匹配的左括号“{” 必须与if 和表达式放在同一行
,如果尝试将“{”放在其他位置,将会触发编译错误
与else 匹配的 “{” 也必须与else 在同一行
else也必须与上-个if 或else if 的右边的大括号在一行
格式:
if 表达式1 { 分支1 } else if 表达式2 { 分支2 } else { 分支3 } // > 10
特殊写法
if 还有特殊的写法,可以在if表达式之前添加一个执行语句,再根据变量值进行判断,如:
if err := Connect(); err != nil { fmt.Println(err) return }
Connect() 为假设的函数,err := Connect() 可以视为一个表达式
Go语言中所有循环类型均可以使用for关键字完成
for 初始语句;条件表达式; 结束语句 {
循环体代码
}
for 循环可以通过break
,goto
,return
,panic
语句强制退出循环
初始语句可以被忽略,但是初始语句之后的分号必须要写
step := 2 for ; step > 0; step-- { fmt.Println(step) } // 2 // 1
条件表达式也可以被忽略,忽略默认为无限循环
结束循环时带可执行语句的无限循环
var i int for ; ; i++ { if i > 10 { fmt.Println("i > 10") break; } } // i > 10
无限循环
for { if i > 10 { fmt.Println("i > 10") break } i++ } // i > 10
在结束每次循环前执行的语句,被break 、goto、return、panic等语句强制推出
示例:
? // 遍历九九乘法表 for x:=1; x < 10; x++ { for y :=1; y <= x; y++ { sum := x * y fmt.Printf("%d * %d = %d ", x, y, sum ) } fmt.Printf("\r\n") } ? 结果 1 * 1 = 1 2 * 1 = 2 2 * 2 = 4 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
Go语言可以使用for range遍历、数据、切片、字符串、map及通道(channel)
规律:
数组、切片、字符串返回索引值
map返回键和值
通道(channel)只返回通道内的值
for key, value := range []int{1,2,3,4} { fmt.Printf("key: %d, value: %d\r\n", key, value ) } ? //key: 0, value: 1 //key: 1, value: 2 //key: 2, value: 3 //key: 3, value: 4 ?
for key, value := range "abcdef" { fmt.Printf("key: %d, value: 0x%x\r\n", key, value ) } ? //key: 0, value: 0x61 //key: 1, value: 0x62 //key: 2, value: 0x63 //key: 3, value: 0x64 //key: 4, value: 0x65 //key: 5, value: 0x66
m := map[int]string{ 1 : "one", 2 : "two", 3 : "three", } for key,value := range m { fmt.Printf("key: %d, value: %s\r\n", key, value ) } // key: 1, value: one // key: 2, value: two // key: 3, value: three
?
c := make(chan int) // 启动一个goroutine,往通道中推送数据1、2、3,然后关闭通道 go func() { c <- 1 c <- 2 c <- 3 close(c) }() ? for v := range c { fmt.Println(v) } // 1 // 2 // 3
不需要获得的key或value,可以用下划线“-”
代替,即匿名变量
匿名变量,可理解为占位符,本身不会进行空间分配,不会占用变量的名字
?
for _, value := range []int{1,2,3,4} { fmt.Printf("value: %d\r\n", value ) } ? // value: 1 // value: 2 // value: 3 // value: 4
for 功能:
Go语言for包含初始条件,条件表达式、结束语句,这3个均可省略
for range 支持数组、切片、字符串、map、通道遍历
可使用匿名变量获取只需要的变量
switch中每个case与case间是独立的代码块,不需要通过break语句跳出当前case代码块以避免执行到下一行
Go语言规定每一个switch只能有一个default分支?
var a = "hello" switch a { case "hello": fmt.Println(1) case "world": fmt.Println(2) default: fmt.Println(0) }
分支常见情况:
一分支多值
? switch a { case "hello", "world" : fmt.Println("Hi") } ?
分支表达式
? var r int = 11 var s int = 5 switch { case r > 10 && r <20: fmt.Println(r) case s > 2 && s <10: fmt.Println(s) } // 11
如果只有一个变量判断的时候,switch后面可以不用添加变量r
fallthrough
关键字用来实现case分支间的执行,应为go语言的case的是独立的代码块
str := "hello" switch { case str == "hello": fmt.Println("hello") fallthrough case str != "world": fmt.Println("world") } // hello // world
goto语句通过标签进行代码间的无条件跳转,可以快速跳出循环避免重复退出上有一定帮助
原代码:
packeage main import ("fmt") func main() { var breakAgain bool for x := 0; x < 10; x++ { for y := 0; y <10; y++ { if y == 2 { breakAgain = true break } } if breakAgain { break } } fmt.Println("done") }
使用goto语句进行优化:
使用goto语句后,无须额外的变量就可以进行快速退出所有的循环
packeage main import ("fmt") func main() { for x := 0; x < 10; x++ { for y := 0; y <10; y++ { if y == 2 { // 跳转到标签 goto breakHere } } ? } // 手动返回,避免执行进入标签 return ? // 标签 breakHere: fmt.Println("done") }
err := firstCheckError() if err != nil { goto onExit } ? err = secondCheckError() if err != nil { goto onExit } ? fmt.Println("done") return ? onExit: fmt.Println(err)
break语句可以跳出for 、switch 和select代码块
break语句后面添加标签,表示退出某个标签对应的代码块,标签必须定义在对应的for、switch和select的代码块上
packeage main import ("fmt") func main() { ? loop: for i:=1; i<=3; i++ { for j := 0; j<5;j++ { switch j { case 2: fmt.Println(i,j) // 退出 loop标签下的这个双循坏代码 break loop case 3: fmt.Println(i,j) break loop } } } }
continue语句结束当前循坏,开始下一个循环,仅限于for循环内使用
continue语句后面添加标签时,表示开始标签对应的循环
packeage main import ("fmt") func main() { ? loop: for i:=0; i<=3; i++ { for j := 0; j<5;j++ { switch j { case 2: fmt.Println(i,j) continue loop } } } // 0 2 // 1 2 // 2 2 // 3 2 }
原文:https://www.cnblogs.com/smallyi/p/11870309.html