【发布时间】:2013-04-03 10:14:21
【问题描述】:
假设我有这些类型:
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"
}
}
有没有更简单或更快的方法?是否可以直接从range获取指针?
显然我不想仅仅为了迭代而改变结构,更冗长的解决方案不是解决方案。
【问题讨论】:
-
那么你想在 JavaScript 中使用某种
Array.prototype.forEach吗? -
这是一个有趣的想法,这可能是一个解决方案,但调用一个函数,而该函数又会在每次迭代中调用一个函数,这在服务器端语言中看起来很重且错误。而缺乏泛型会让这种感觉更加沉重。
-
老实说,我不认为它有那么重。调用一两个函数非常便宜,这通常是编译器最优化的。我会尝试并对其进行基准测试,看看它是否符合要求。
-
由于 Go 缺乏泛型,我担心传递给
forEach的函数必须以类型断言开头。这并不比attr := &n.Attr[i]好。