当前位置: 首页 > 面试题库 >

迭代时更改值

金飞
2023-03-14
问题内容

假设我有以下几种类型:

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

显然,我不想仅仅为了迭代而更改结构,更冗长的解决方案不是解决方案。


问题答案:

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

原因是range从您要遍历的切片中复制值。关于范围的规范说:

Range expression                          1st value             2nd

value (if 2nd variable is present)
array or slice a [n]E, *[n]E, or []E index i int a[i]
E



因此,范围a[i]用作数组/切片的第二个值,这实际上意味着该值已被复制,从而使原始值不可触摸。

下面的代码演示了此行为:

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

因此,您唯一可以做的就是使用指针或html" target="_blank">索引,正如jnml和peterSO所建议的那样。



 类似资料:
  • 问题内容: 我知道您不应在遍历列表时添加/删除项目。但是,如果不更改列表长度,是否可以修改要迭代的列表中的项目? 还是应该迭代列表索引?像那样: 问题是:以上两种方式都是允许的,还是只有第二种是没有错误的? 如果答案是肯定的,以下代码段是否有效? UPD。我想在python文档中看到“允许这些操作”而不是某人的假设。 问题答案: 可以这么说,您 不是在 修改列表。您只是在修改列表中的元素。我不认为

  • 问题内容: 我有一个包含一些键(字符串)和值(POJO)的地图 我想遍历此映射并更改POJO中的某些数据。 我继承的当前代码将删除给定的条目,并在对POJO进行一些更改后将其重新添加。 这不能很好地进行,因为在遍历地图时您不应该修改地图(方法已同步,但ConcurrentModificationException仍然出现) 我的问题是 ,如果我需要遍历地图并更改值,我可以使用的最佳实践/方法是什么

  • 问题内容: 上面的python代码使输出与预期的完全不同。我想循环播放项目,以便在循环播放时可以跳过某个项目。 问题答案: 该代码试图在迭代列表时修改列表。我在任何情况下都不会这样做。 你可以使用运算符跳过列表中的每三个项目。 关于我的示例的其他要点与中的新语法有关。 我使用列表推导定义t,因为它在中有效(请参见下文) t是中的函数 现在,的行为类似于,但它适用于任意大小的值。后者不再存在。

  • 问题内容: 假设我们有一个Python字典,我们正在像这样迭代它: (并且仅仅是一些黑盒转换。) 换句话说,我们尝试在使用对其进行迭代的同时向其中添加/删除项目。 这个定义好吗?您能否提供一些参考来支持您的答案? (很明显,如果损坏了该如何解决,所以这不是我所追求的角度。) 问题答案: 在python文档页面(针对2.7)上明确提到了 使用而添加或删除字典条目可能会产生一种或无法遍历所有条目。 对

  • 问题内容: 是否可以在迭代过程中更改同一HashMap实例的键?因为地图条目集没有方法entry.setKey()。现在我能想到的是创建另一个HashMap … 问题答案: 您应该将信息保留在其他集合中,以便在迭代后对其进行修改。您只能在迭代器期间使用删除条目。合同禁止在迭代过程中对其进行更改。

  • 我想在字符串与给定值匹配时更新该值 有没有人可以使用Java streams API来实现上述功能