让我们假设我有这些类型:
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已经提出的。