「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
写在前面👀
今天主要聊聊循环语句🍕
一、for循环语句🍔
在Go语言中,虽然循环语句只有for语句,没有while语句,但也是够用了🍟
1.无条件的for循环🧂
- 语法👇
for{ //类似 while true{}
// 替代 for (;;) {}
循环体代码 //无限循环做这条语句
} //无限循环的经典应用是服务器,用于不断等待和接受新的请求
- 示例👇 工作使我幸福😵
package main
import "fmt"
func main() {
for {
fmt.Println("我要一直工作下去!")
}
}
- 结果👇 刚开始还被360检测成木马了😂
2.只有条件语句的for循环🥓
- 语法👇
for 条件语句 { //类似while(条件语句){}
循环体代码
}
- 示例👇 反向输出字符串🎗
package main
import "fmt"
func main() {
s := "Go!Go!Go!"
n := len(s)
for n > 0 { // 替代 while (n > 0) {}
n--
fmt.Printf("%c",s[n]) // 替代 for (; n > 0;) {}
}
}
- 结果👇
3.常规的for循环🥚
- 语法👇
for 初始语句;条件语句;结束语句{
循环体代码 // 常⻅的 for 循环,⽀持初始化语句
}
- 示例👇 倒计时⏱
package main
import (
"fmt"
"time"
)
func main() {
for count := 10; count > 0; count-- {
fmt.Println(count)
time.Sleep(time.Second)
}
fmt.Println("发射!")
}
- 结果👇
二、for range循环语句🍳
for 循环的 range 格式可以可以遍历数组、字符串、切片(slice)映射(map) 及通道(channel)等
- 语法👇
for key, value := range object {
循环代码
}
类型 | 索引 | 值 | 编码 |
---|---|---|---|
string | index | s[index] | unicode, rune |
array/slice | index | s[index] | |
map | key | m[key] | |
channel | element |
- 首先提一个问题:如果使用 for 循环迭代一个 Unicode 编码的字符串,会发生什么? 示例👇
package main
import "fmt"
func main() {
s1 := "我是要成为海贼王的男人!"
s2 := "海賊王になる男です!"
for i := 0; i < len(s1); i++ {
fmt.Printf("%c", s1[i])
}
for i := 0; i < len(s2); i++ {
fmt.Printf("%c", s2[i])
}
}
- 结果👇
结果就很离谱,是一堆乱码,该怎么办呢?我们可以用for fange变绿字符串
1. 用for range遍历字符串🧇
ASCII 编码的字符占用 1 个字节,既每个索引都指向不同的字符,而非 ASCII 编码的字符(占有 2 到 4 个字节)不能单纯地使用索引来判断是否为同一个字符
range 对应字符串遍历比较特殊,value 会对应一个 rune(int32) 类型;而不是一个 byte。 每个 rune 字符和索引在 for-range 循环中是一一对应的。它能够自动根据 UTF-8 规则识别 Unicode 编码的字符。rune 类型是 4byte,因此他有足够的长度表示中文字符(3byte)
- 示例👇
package main
import "fmt"
func main() {
s1 := "我是要成为海贼王的男人!"
s2 := "海賊王になる男です!"
for index, value := range s1 {
fmt.Printf("index: %d, value: %c\n", index, value)
}
for index, value := range s2 {
fmt.Printf("index: %d, value: %c\n", index, value)
}
}
- 结果👇
2.用for range 遍历map
- 示例👇
package main
import (
"fmt"
)
func main() {
m := map[int](string){
2103030105: "小王",
2103030106: "小郦",
2103030107: "小白",
}
for key, value := range m {
fmt.Printf("学号 : %d 姓名 : %s\n", key, value)
}
}
- 结果👇
3.在for range中使用匿名变量🥞
如果在 for range
遍历中只想获取下标索引,或者是值可以用匿名变量 _
占位符,它既不会分配内存,也不会占用变量名,可以通过匿名变量接受键 key,也可以接受值 value
- 示例👇 比如我只想取出姓名,那就可以用匿名变量接受学号
package main
import (
"fmt"
)
func main() {
m := map[int](string){
2103030105: "小王",
2103030106: "小郦",
2103030107: "小白",
}
for _, value := range m {
fmt.Printf("姓名 : %s\n", value)
}
}
- 结果👇
写在后面
感谢观看✨
如有不足,欢迎指出💖
今天本来想把跳转语句也写完了,但宿舍突然断电,黑灯瞎火看不清键盘😣