我在特定结构的一部分上有以下范围:
var t1, t2 *time.Time
for _, d := range entries {
if d.EntryType == print {
t1 = &d.LogTime
}
if d.EntryType == saw {
t2 = &d.LogTime
}
}
在我的示例中,我的结构中有两个对象,我知道它们是不同的。但是,当我用 String 打印两个时间指针或进行一些计算时,我可以看到两者与第二个具有相同的值。
当我将作业更改为
tmp := d.LogTime
t1 = &tmp
我可以进行计算,因为两个指针都指向不同的对象。
最佳答案
应用程序获取变量 d
的地址,而不是 slice 元素的地址。变量 d
的作用域在循环之外,并且在循环的每次迭代中都具有相同的地址。
代码
tmp := d.LogTime
t1 = &tmp
之所以有效,是因为 tmp
的作用域在循环内。
也许您打算获取 slice 元素的地址。如果是这样,请使用此代码:
for i:= range entries {
if d.EntryType == print {
t1 = &entries[i].LogTime
}
if d.EntryType == saw {
t2 = &entries[i].LogTime
}
}
这里使用 *time.Time
值可能是有原因的,但通常应用程序使用 time.Time
。此代码可以满足您的需要:
var t1, t2 time.Time
for _, d := range entries {
if d.EntryType == print {
t1 = d.LogTime
}
if d.EntryType == saw {
t2 = d.LogTime
}
}
关于pointers - slice 和指针上的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50050501/