切片和指针上的范围

时间:2018-04-26 19:21:01

标签: pointers go slice

我在特定结构的切片上有以下范围:

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

我可以进行计算,因为两个指针都指向不同的对象。

1 个答案:

答案 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
    }
}