数组 – 在golang中迭代时更改值

前端之家收集整理的这篇文章主要介绍了数组 – 在golang中迭代时更改值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
让我们假设我有这些类型:
type Attribute struct {
    Key,Val string
}
type Node struct {
    Attr []Attribute
}

并且我想迭代我的节点的属性来更改它们。

我本来希望能够做到

for _,attr := range n.Attr {
    if attr.Key == "href" {
        attr.Val = "something"
    }
}

但作为attr不是一个指针,这将不工作,我必须做

for i,attr := range n.Attr {
    if attr.Key == "href" {
        n.Attr[i].Val = "something"
    }
}

有更简单或更快的方式吗?是否可以直接从范围获取指针?

显然,我不想改变结构只是为了迭代和更冗长的解决方案没有解决方

不,你想要的缩写是不可能的。

这样做的原因是范围复制您要迭代的切片中的值。
specification about range说:

06000

所以,range使用a [i]作为数组/切片的第二个值,这有效地意味着
值被复制,使原始值无法接近。

这种行为由following code

x := make([]int,3)

x[0],x[1],x[2] = 1,2,3

for i,val := range x {
    println(&x[i],"vs.",&val)
}

代码为范围和实际值打印出完全不同的内存位置
值:

0xf84000f010 vs. 0x7f095ed0bf68
0xf84000f014 vs. 0x7f095ed0bf68
0xf84000f018 vs. 0x7f095ed0bf68

所以,你可以做的唯一的事情是使用指针或索引,如jnml和peterSO已经提出的。

猜你在找的Go相关文章