加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 18:11:24 所属栏目:大数据 来源:网络整理
导读:让我们假设我有这些类型: type Attribute struct { Key,Val string}type Node struct { Attr []Attribute} 并且我想迭代我的节点的属性来更改它们。 我本来希望能够做到 for _,attr := range n.Attr { if attr.Key == "href" { attr.Val = "something" }}
让我们假设我有这些类型:
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已经提出的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读