这个篇幅是学习golang入门记录,方便查找
for循环
for循环还是golang中的唯一循环语句,golang中没有while循环。
- for循环形式一:
for i:=0;i<10;i++ {
fmt.Println(i)
}
这是标准的for循环格式
- for循环形式二
index := 0
for index < 10 {
fmt.Println(index)
index ++
}
或者:
index := 0
for ;index < 10; {
fmt.Println(index)
index ++
}
这种相当于是while(condition){}
模式
- for循环形式三
index := 0
for {
fmt.Println(index)
index ++
if index > 10 {
break
}
}
- for循环形式四,for range
arr := [3]int{1,2,3}
for index,value :=range arr {
fmt.Println(index,value)
}
需要注意的是,for range中循环的对象是一个原值的复制,并不是原值对象
:
numbers2 := [...]int{1, 2, 3, 4, 5, 6}
maxIndex2 := len(numbers2) - 1
for i, e := range numbers2 {
if i == maxIndex2 {
numbers2[0] += e
} else {
numbers2[i+1] += e
}
fmt.Println(e)
}
fmt.Println(numbers2)
打印结果:
1
2
3
4
5
6
[7 3 5 7 9 11]
这里面的遍历对象是复制的,for range在第一次遍历的时候会进行求值,之后就不会在变了,即使原值发生改变,这里遍历过程中i,e
在遍历开始的时候就已经确定好值了,遍历过程中不会发生改变。但是我们可以在遍历过程中去改变原来的数组或者切片。
当for语句被执行的时候,在range关键字右边的变量会先被求值。range表达式的结果值可以是数组、数组的指针、切片、字符串、字典或者允许接收操作的通道中的某一个,并且结果值只能有一个。
1. range表达式只会在for语句开始执行时被求值一次,无论后边会有多少次迭代;
2. range表达式的求值结果会被复制,也就是说,被迭代的对象是range表达式结果值的副本而不是原值。
if条件判断
golang中条件判断语句格式如下:
if condition {
} else if condition {
} else {
}
同时在if判断条件中可以加入变量初始化语句,用分号分隔:
if local_filed := value ; condition {
} else if condition {
} else {
}
golang中if语句要求:
- if语句的条件不需要使用括号将条件包含起来
- {}必须存在,及时只有一行语句
- { 必须在if或else的同一行
- 在if之后,条件之前,可以增加变量初始化语句,用分号进行分隔
switch
golang中swith一般格式如下:
switch filed_name {
case typ1,typ2 :
...
case type3,typ4 :
...
default:
...
}
示例:
month := 3
switch month {
case 1,2,3 :
fmt.Println("Spring")
case 4,5,6:
fmt.Println("Summer")
case 7,8,9:
fmt.Println("Fall")
case 10,11,12 :
fmt.Println("Winter")
default:
fmt.Println("error month")
}
swith也可以不指定表达式:
month := 3
switch {
case month<4:
fmt.Println("Spring")
case month > 3 && month < 7:
fmt.Println("Summer")
case month >6 && month < 10:
fmt.Println("Fall")
case month>9 && month <13 :
fmt.Println("Winter")
default:
fmt.Println("error month")
}
这时候相当于是switch true
,这时候其实用if表达式更好。
swith也可以在swith之后比倒是之前初始变量,和if一样:
switch month := 3 ; month {
case 1,2,3 :
fmt.Println("Spring")
case 4,5,6:
fmt.Println("Summer")
case 7,8,9:
fmt.Println("Fall")
case 10,11,12 :
fmt.Println("Winter")
default:
fmt.Println("error month")
}
swith中还可以在case语句里面接fallthrough,因为golang中的swich满足case语句后并不会继续向后面的case语句执行,不用增加break,如果想让当前case语句执行完,接着执行接下来的一个case语句,可以加fallthrough
:
switch month := 3 ; month {
case 1,2,3 :
fmt.Println("Spring")
fallthrough
case 4,5,6:
fmt.Println("Summer")
case 7,8,9:
fmt.Println("Fall")
case 10,11,12 :
fmt.Println("Winter")
default:
fmt.Println("error month")
}
上面会打印:
Spring
Summer
switch语句不允许case表达式中的子表达式结果值存在相等的情况,不论这些结果值相等的子表达式,是否存在于不同的case表达式中,都会是这样的结果。
select
golang中select主要是配合chan使用,用来监听channel上的数据流动。需要注意的是:
- select不会循环,如果需要循环,需要在select外面加for循环
- select中会从就绪的case中随机选择一个执行,如果没有case就绪,那么select会阻塞
- 一般不要在select中增加defaut默认分支,会导致空轮询
dataChan := make(chan int)
go func(){
for{
select {
case data := <-dataChan :
fmt.Println(data)
}
}
}()
break、continue
golang中的break中break只能跳出当前一层循环,如果有多个嵌套循环层,不能跳出所有循环层,只能跳出break所在从循环层
golang中continue表示终止本次循环,开始下次循环
goto
我们知道break只能跳出当前层循环,如果我们想跳出多层循环,可以使用goto,这里golang的goto与c中类似:
一般结构如下:
...
goto label
...
label: statement
...
示例如下:
i := 0
for ;i<10;i++ {
for j:=0;j<10;j++ {
if i == 5 && j == 5 {
goto gotoHere
}
fmt.Println(i,j)
}
}
gotoHere:
fmt.Println(i)