美文网首页
go for-range 的坑

go for-range 的坑

作者: Hmcf | 来源:发表于2019-11-26 11:12 被阅读0次

关键字range可用于循环,类似迭代器操作,它可以遍历slice,array,string,map和channel,可以使用”_”来忽略不想要的返回值。
通过 for range 遍历的返回值有一定的规律:

  • 数组、切片、字符串返回索引和值。
  • map 返回键和值。
  • 通道(channel)只返回通道内的值。

需要要注意的是,val 始终为集合中对应索引的值拷贝,因此它一般只具有只读性质,对它所做的任何修改都不会影响到集合中原有的值。

如:

package main

import "fmt"

func main() {
    str1 := []string{"1", "2", "3", "4"}
    for _, value := range str1 {
        if value == "2" || value == "4" {
            value = "6"
        }
    }
    fmt.Println(str1)
}

这种操作是不会对原有数据产生影响的。

如果想要改变,可参考下面的操作

type T struct {
     n int
}
 
func main() {
    ts := [2]T{}
    for i, t := range ts {
        switch i {
            case 0:
                t.n = 3
                ts[1].n = 9
            case 1:
                fmt.Print(t.n, " ")
        }
    }
    fmt.Print(ts)
}

输出 0 [{0} {9}]
for-range 循环数组,此时使用的是数组 ts 的副本,所以 t.n = 3 的赋值操作不会影响原数组,而ts[1].n=9,直接对原有数组进行赋值是会产生影响的。

type T struct {
    n int
}

func main() {
    ts := [2]T{}
    for i, t := range &ts {
        switch i {
        case 0:
            t.n = 3
            ts[1].n = 9
        case 1:
            fmt.Print(t.n, " ")
        }
    }
    fmt.Print(ts)
}

输出 9 [{0} {9}]
for-range 数组指针。for-range 循环中的循环变量 t 是原数组元素的副本。如果数组元素是结构体值,则副本的字段和原数组字段是两个不同的值。

相关文章

网友评论

      本文标题:go for-range 的坑

      本文链接:https://www.haomeiwen.com/subject/xvlewctx.html