首页 > 解决方案 > 切片和指针的范围

问题描述

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

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

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

标签: pointersgoslice

解决方案


应用程序正在获取变量d的地址,而不是切片元素的地址。该变量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
    }
}

推荐阅读