Go入门之控制语句(中) 写在前面👀 写在后面

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

写在前面👀

今天主要聊聊循环语句🍕

一、for循环语句🍔

在Go语言中,虽然循环语句只有for语句,没有while语句,但也是够用了🍟

1.无条件的for循环🧂

  • 语法👇
1
2
3
4
go复制代码for{               //类似 while true{} 
// 替代 for (;;) {}
循环体代码 //无限循环做这条语句
} //无限循环的经典应用是服务器,用于不断等待和接受新的请求
  • 示例👇
    工作使我幸福😵
1
2
3
4
5
6
7
8
9
10
go复制代码package main

import "fmt"

func main() {
for {
fmt.Println("我要一直工作下去!")
}

}
  • 结果👇
    刚开始还被360检测成木马了😂

image.png

2.只有条件语句的for循环🥓

  • 语法👇
1
2
3
go复制代码for 条件语句 {   //类似while(条件语句){}
循环体代码
}
  • 示例👇
    反向输出字符串🎗
1
2
3
4
5
6
7
8
9
10
11
12
go复制代码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;) {}
}
}
  • 结果👇

image.png

3.常规的for循环🥚

  • 语法👇
1
2
3
go复制代码for 初始语句;条件语句;结束语句{
循环体代码 // 常⻅的 for 循环,⽀持初始化语句
}
  • 示例👇
    倒计时⏱
1
2
3
4
5
6
7
8
9
10
11
12
go复制代码package main
import (
"fmt"
"time"
)
func main() {
for count := 10; count > 0; count-- {
fmt.Println(count)
time.Sleep(time.Second)
}
fmt.Println("发射!")
}
  • 结果👇

image.png

二、for range循环语句🍳

for 循环的 range 格式可以可以遍历数组、字符串、切片(slice)映射(map) 及通道(channel)等

  • 语法👇
1
2
3
go复制代码for key, value := range object {
循环代码
}
类型 索引 编码
string index s[index] unicode, rune
array/slice index s[index]
map key m[key]
channel element
  • 首先提一个问题:如果使用 for 循环迭代一个 Unicode 编码的字符串,会发生什么?
    示例👇
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
go复制代码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])
}
}
  • 结果👇

image.png
结果就很离谱,是一堆乱码,该怎么办呢?我们可以用for fange变绿字符串

1. 用for range遍历字符串🧇

ASCII 编码的字符占用 1 个字节,既每个索引都指向不同的字符,而非 ASCII 编码的字符(占有 2 到 4 个字节)不能单纯地使用索引来判断是否为同一个字符

range 对应字符串遍历比较特殊,value 会对应一个 rune(int32) 类型;而不是一个 byte。
每个 rune 字符和索引在 for-range 循环中是一一对应的。它能够自动根据 UTF-8 规则识别 Unicode 编码的字符。rune 类型是 4byte,因此他有足够的长度表示中文字符(3byte)

  • 示例👇
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
go复制代码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)
}
}
  • 结果👇

image.png

2.用for range 遍历map

  • 示例👇
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
go复制代码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)
}
}
  • 结果👇

image.png

3.在for range中使用匿名变量🥞

如果在 for range 遍历中只想获取下标索引,或者是值可以用匿名变量 _ 占位符,它既不会分配内存,也不会占用变量名,可以通过匿名变量接受键 key,也可以接受值 value

  • 示例👇
    比如我只想取出姓名,那就可以用匿名变量接受学号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
go复制代码package main

import (
"fmt"
)

func main() {
m := map[int](string){
2103030105: "小王",
2103030106: "小郦",
2103030107: "小白",
}
for _, value := range m {
fmt.Printf("姓名 : %s\n", value)
}
}
  • 结果👇

image.png

写在后面

感谢观看✨

如有不足,欢迎指出💖

今天本来想把跳转语句也写完了,但宿舍突然断电,黑灯瞎火看不清键盘😣

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%