for range 语句

97 阅读1分钟

for range 格式

for 循环的 range 格式可以对 slicemap、数组、字符串、channel 等进行迭代循环

func main() {
    for key, value := range object {
        fmt.Println(key, value)
    }
}
func main() {
    // 使用匿名变量来忽略 key
    for _, value := range object {
        fmt.Println(value)
    }
}

不同数据类型的 for range

在不同的数据类型中,for rangekey 代表是不一样

类型KeyValue省略 Key 的返回值
字符串字符串的索引字符串对应索引的字符串的拷贝索引
数组数组的索引索引对应的值的拷贝索引
切片切片的索引索引对应的值的拷贝索引
mapmap 的 keymap 的 value 的拷贝map 的 value
channel-channel 接收的数据-

遍历字符串

func main() {
    // utf-8 字符串
    var cartoon string = "Naruto 火影忍者 🍃"
   
    // 这种方式是错误的 🙅‍
    for k, _ := range cartoon {
        fmt.Printf("%c\n", cartoon[k]) // 一个中文占3个字节,这样只会取出第1个字节,中文会出现乱码!
    }
   
    // 方式1 推荐
    for _, v := range cartoon {
        fmt.Printf("%c\n", v)
    }

    // 方式2 不推荐
    cartoonRuneSlice := []rune(cartoon)
    for i := 0; i < len(cartoonRuneSlice); i++ {
        fmt.Printf("%c\n", cartoonRuneSlice[i])
    }
}