我在特定结构的切片上有以下范围:
var t1, t2 *time.Time
for _, d := range entries {
if d.EntryType == print {
t1 = &d.LogTime
}
if d.EntryType == saw {
t2 = &d.LogTime
}
}
在我的例子中,我的结构中有两个对象,我知道它们是不同的。但是当我使用String打印Time指针或者进行一些计算时,我可以看到它们都具有与第二个相同的值。
当我将作业更改为
时tmp := d.LogTime
t1 = &tmp
我可以进行计算,因为两个指针都指向不同的对象。
答案 0 :(得分:3)
应用程序采用变量d
的地址,而不是切片元素的地址。变量d
的作用域在循环外部,并且在循环的每次迭代中都具有相同的地址。
代码
tmp := d.LogTime
t1 = &tmp
有效,因为tmp
的范围在循环中。
也许您打算获取切片元素的地址。如果是这样,请使用以下代码:
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
}
}