Go 语言没有 while 和 do...while 语法。
语句块中可以用continue语句跳过本次循环继续下一次循环。break语句跳出循环。
for 循环变量初始化; 循环条件; 循环变量迭代 {
//语句块
}
例子如下:i 的作用域在for循环和它的语句块内。
for i := 0; i < 5; i++ {
fmt.Println("循环",i) //输出:循环 0 到 循环 4
}
var i int = 0
for ; i < 5; i++ {
fmt.Println("循环",i) //输出:循环 0 到 循环 4
}
var i int = 0
for i < 5 {
fmt.Println("循环",i) //输出:循环 0 到 循环 4
i ++
}
for {
fmt.Println("死循环体")
break //跳出循环
}
for ; ; {
fmt.Println("死循环体2")
}
for ; ; {
num ++
if num == 1 {
fmt.Println("死循环体2",num) //死循环体2 1
continue
}else if num > 3 {
fmt.Println("死循环体2",num) //死循环体2 4
break
}
}
5.1、常规遍历方式如下:这种遍历是按照字节遍历,因此如果有中文等非英文字符,就会出现乱码。
var str string = "你好,hi"
for i := 0 ; i < len(str) ; i++ {
//遍历是按照字节遍历,因此如果有中文等非英文字符,就会出现乱码
fmt.Printf("str[%d]=%c\n", i, str[i])
}
输出如下:按照字节遍历,str[i] 从0到8,每个中文3个字节。
5.2、切片解决乱码问题。要使用传统方式遍历,可以把字符串转换为rune类型的切片。这时候就不是遍历字符串类型,而是遍历rune类型的切片了。
var strOld string = "你好,hi"
str := []rune(strOld)
for i := 0 ; i < len(str) ; i++ {
fmt.Printf("str[%d]=%c \n", i, str[i])
}
5.3、for-range遍历方式如下:
var str string = "你好,hi"
for i, ch := range str {
fmt.Printf("str[%d]=%c \n", i, ch)
}
其中 i 表示字符串下标的起始位置;range str 表示遍历str字符串;ch是字符串的值。运行结果如下:
6.1、while语句的实现:
for {
if 条件表达式 {
break //跳出循环
}
其他语句块
循环变量迭代
}
6、2、do...while语句的实现:
for {
其他语句块
循环变量迭代
if 条件表达式 {
break //跳出循环
}
}
例子如下:外面一层死循环,里面用break直接跳到标签lable1,跳出了2层循环。
func main() {
lable1 :
for { //死循环
for i := 0 ; i < 4 ; i++ {
fmt.Printf("进入循环。。。。%d", i)
break lable1
}
}
}
func main() {
lable1 :
for k := 0 ; k < 2 ; k++ {
fmt.Printf("外层循环。。。。%d \n", k)
for i := 0 ; i < 4 ; i++ {
fmt.Printf("内层for循环。。。。%d \n", i)
continue lable1
}
}
}
执行之后输出如下:
外层循环。。。。0
内层for循环。。。。0
外层循环。。。。1
内层for循环。。。。0
continue 跳到 lable1标签,就是把内层的循环结束了。外层的循环还是继续下一个循环。
如果有3层循环,continue 到最外面就把内部的2个循环跳过了。