for循环基本用法:
for i := 0; i < 10; i++ {
fmt.Println(i)
}
在上面的for循环中,变量 i 仅在for循环内部有效,跳出for循环后,变量i未定义。
第二种写法:
r := 10
for ; r < 20; r++ {
fmt.Println(r)
}
fmt.Println(r)
上面的for循环,循环变量 r 在外部定义,跳出for循环后,变量r的值为for循环中最后一字自增的值。
上面的for循环,还可以做以下简写:
i := 10 //循环变量初始化
for ; i < 20 ; { //循环条件
fmt.Println(i)
i++ //循环变量迭代
}
fmt.Println(i)
省略分号,继续简写:
var m = 10
for m < 20 { //等价于 ; m < 20 ;
fmt.Println(m)
m++
}
fmt.Println(m)
第三种写法:
n := 10
for ;; {
if n == 20 {
break;
}
fmt.Println(n)
n++
}
fmt.Println(n)
这种 ; ; 的写法省去了循环条件,是一个无限循环,通常需要配合break使用。
甚至可以省略所有:
x := 10
for { //等价于 for ;;
if x == 20 {
break
}
fmt.Println(x)
x++
}
fmt.Println(x)
遍历英文字符串:
Golang可以通过for循环遍历字符串,使用方式:
//字符串遍历方式
var str string = "hello"
for i := 0; i < len(str); i++ {
//通过下标取值,会返回该字符对应的ASCII码值
tmp := str[i]
//将ASCII码转成字符串
//string := fmt.Sprintf("%c", tmp) //转换方式一
string := string(tmp) //转换方式二
fmt.Println(tmp, "=>", string)
}
for-range在Golang中用来遍历数组,也可以遍历字符串:
//通过for-range遍历
//index是下标
//rune是字符对应的ASCII码
var str string = "hello world"
for index, rune := range str {
//获取ASCII码对应的字符串
tmp := string(rune)
fmt.Println(index, rune, tmp)
}
遍历中文字符串:
若字符串中包含中文,使用默认的遍历字符串方式会出现乱码,Golang使用UTF8编码,默认按照字节对字符串进行遍历,每个英文字符占用1个字节,每个汉字占3个字节。
遍历中文汉字时,可使用切片的方式:
//遍历包含中文的字符串
var str string = "hello,world!我在这里。"
//解决方法,将str2转成[]rune切片
slice := []rune(str)
for i := 0; i < len(slice); i++ {
tmp := slice[i]
fmt.Println(string(tmp))
}
for-range按照字符方式遍历,因此如果字符串中有中文,也可以正常输出:
var str string = "hello,world!我在这里。"
for index, rune := range str {
//获取ASCII码对应的字符串
fmt.Println(index, string(rune))
}
while和do..while的实现:
Go语言没有while和do..while语法,可以通过for循环来实现while和do..while的效果。
具体方式和在上面的for循环第三种写法中已经出现过,实现方式就是:在一个无限循环的for循环中,执行某些操作,当循环条件满足时,通过break跳出for循环。
语法如下:
循环变量初始化
for {
if 循环条件表达式 {
break //跳出循环
}
循环内的相关操作
循环变量迭代
}
do..while的实现:
循环变量初始化
for {
循环内的相关操作
循环变量迭代
if 循环条件表达式 {
break //跳出循环
}
}
由上面的代码可看出:
1、在Go语言中,while和do..while都可以通过无限for循环实现,当循环条件成立后,通过break跳出循环;
2、通过for循环模拟实现while和do..while的区别是:while先判断再执行,可能不执行内部语句就会跳出,而do..while先执行再判断,因此至少执行一次。
下一篇:Golang生成随机数