1、条件控制
go中,存在三个条件控制的关键字:if else、swtich、select。
1.1 if else:使用和其他开发语言差不多。
go
if 表达式 { //表达式必须返回一个布尔值
//do someing
} else {
//or do someing
}
1.2 switch
switch
语句格式:
go
switch expr {
case case1:
statement1
case case2:
statement2
default:
default statement
}
fallthrough
关键字:作用:继续执行下一个分支
go
func main() {
num := 2
switch {
case num >= 0 && num <= 1:
num++
case num > 1:
num--
fallthrough // 执行完该分支后,会继续执行下一个分支
case num < 0:
num += num
}
fmt.Println(num)
}
1.4 select
select在并发
中使用。
select 语句只能用于通道(Channel)操作,每个 case 必须是一个通道操作,要么是发送要么是接收。
go
package main
func main() {
chan1 := make(chan int)//创建一个channel
chan2 := make(chan int)
//创建一个协程
go func() {
chan1 <- 1
}()
//创建一个协程
go func() {
chan2 <- 2
}()
for true {
select {
case v1 := <-chan1:
// 当chan1有值写入时,执行
println("chan1:", v1)
case v2 := <-chan2:
// 当chan2有值写入时,执行
println("chan2:", v2)
default:
break
}
}
}
1.5 label
-
标签语句,可以结合
goto
、break
、continue
的目标。给某段代码块进行打标签,后续可以通过
goto
等关键字,将代码执行流程跳转到该段代码。 标签只标注了位置,而不是包含某一段代码,只是为了goto
等关键字将当前的执行位置,跳转到标签后,从该标签的位置继续执行。
go
package main
import "fmt"
func main() {
num := 1
if num < 10 {
fmt.Println("goto A")
goto A //执行跳转到A标签所在代码块,从A标签位置继续往下执行
}
//因以上条件已经跳转到标签A的位置,所以该代码块不能被执行
if num > 10 {
fmt.Println("goto B")
goto B
}
A:
fmt.Println("start A")
num += 10
B:
//标签只标注了位置,所以从标签A继续往下执行,该代码块也会被执行
fmt.Println("start B")
num -= 10
fmt.Println(num, " end num")
}
//执行结果
//goto A
//start A
//start B
//1 end num
1.6 goto
- 结合
label
标签使用,将控制权传递给在同一函数
中对应标签
的位置。 - 通过
label
和goto
结合使用,也能够在一定程度上实现循环控制。
go
func main() {
a := 1
if a == 1 {
goto A
} else {
fmt.Println("b")
}
A:
fmt.Println("a")
}
//输出结果
//a
2、 循环控制
- 在Go中
有且只有一个中循环控制
:for,没有像Java中的while。
2.1 for
- 表达式
go
for init statement; expression; post statement {
execute statement
}
- 使用案例
go
func main() {
for i := 1; i < 10; i++ {
fmt.Printf("num:%d\n", i)
}
}
- 当
for
循环只保留表达式,就变成其他语言中的while
。
go
func main() {
i := 1
for i <= 10 {
fmt.Println(i)
i++
}
}
2.2 for range
for range
可以更加方便的遍历一些可迭代的数据结构,如数组,切片,字符串,映射表,通道。
go
for index, value := range iterable { //index:迭代的索引,value:索引下对应的值
// do someing
}
2.3 break
break
关键字会终止最内层的for
循环。
go
func main() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i <= j {
break
}
fmt.Println(i, j)
}
}
}
2.4 continue
continue
关键字会跳过最内层循环的本次迭代,直接进入下一次迭代。
go
func main() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i > j {
continue
}
fmt.Println(i, j)
}
}
}
- 还可以结合标签(
label
),跳转到相应的标签位置。
go
func main() {
Out:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i > j {
continue Out
}
fmt.Println(i, j)
}
}
}