Go入门之控制语句(中)

459 阅读3分钟

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

写在前面👀

今天主要聊聊循环语句🍕

一、for循环语句🍔

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

1.无条件的for循环🧂

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

import "fmt"

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

}

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

image.png

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;) {}
	}
}

  • 结果👇

image.png

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("发射!")
}

  • 结果👇

image.png

二、for range循环语句🍳

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

  • 语法👇
for key, value := range object {
    循环代码
}   
类型索引编码
stringindexs[index]unicode, rune
array/sliceindexs[index]
mapkeym[key]
channelelement
  • 首先提一个问题:如果使用 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])
	}
}

  • 结果👇

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)

  • 示例👇
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

  • 示例👇
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

  • 示例👇 比如我只想取出姓名,那就可以用匿名变量接受学号
package main

import (
	"fmt"
)

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

  • 结果👇

image.png

写在后面

感谢观看✨
如有不足,欢迎指出💖
今天本来想把跳转语句也写完了,但宿舍突然断电,黑灯瞎火看不清键盘😣