数组 – 在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已经提出的。

相关文章

类型转换 1、int转string 2、string转int 3、string转float ...
package main import s "strings" import...
类使用:实现一个people中有一个sayhi的方法调用功能,代码如...
html代码: beego代码:
1、读取文件信息: 2、读取文件夹下的所有文件: 3、写入文件...
配置环境:Windows7+推荐IDE:LiteIDEGO下载地址:http:...