golang学习笔记10-循环结构
注:本人已有C,C++,Python基础,只写本人认为的重点。
go的循环只有for循环,但有多个语法,可以实现C/C++中的while和do while。当然,for循环也有break和continue,这点和C/C++相同。
语法1:
for 循环变量初始化;循环进行条件;循环变量迭代{
//执行语句
}
例1:
for i := 1; i <= 10; i++ {
fmt.Println("hello,world", i)
}
例2:
//字符串遍历方式1-传统方式
var str string = "hello,world!北京"
str2 := []rune(str)
for i := 0; i < len(str2); i++ {
fmt.Printf("%c \n", str2[i]) //使用到下标...
}
注意:go的字符串是以字节形式存储的,当存在一个字节表示不了的字符时,要转成rune切片,所以这里的str2已经是rune切片了。
len是统计变量的容量,源码中有说明,不做赘述。
语法2:
for 循环进行条件{
//执行语句
}
例:
j := 1 //循环变量初始化
for j <= 10 { //循环条件
fmt.Println("hello,world", j)
j++ //循环变量迭代
}
这种情况其实就是C/C++的while,不难看出,把循环条件放循环体末尾就是do while。
语法3:
for {
//执行语句
}
上述执行语句如果没有break就是死循环,所以通常要加上break。
例:
k := 1
for { // 这里也等价 for ; ; {
if k <= 10 {
fmt.Println("ok~~", k)
} else {
break //break就是跳出这个for循环
}
k++
}
语法4,for-range:
//字符串遍历方式2-for-range
str = "abc~ok上海"
for index, val := range str {
fmt.Printf("index=%d, val=%c \n", index, val)
}
显然,for range可以直接遍历UTF-8字符串,因为它会将字符串视作Unicode码点(rune)进行遍历,即:在每次迭代时,for range 会从字符串中提取一个完整的Unicode字符(即一个 rune),同时返回字符的索引和对应的Unicode值,所以我们还需要使用%c才能显示原来的字符。