pointers - slice 和指针上的范围

标签 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 打印两个时间指针或进行一些计算时,我可以看到两者与第二个具有相同的值。

当我将作业更改为

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/

相关文章:

c - 创建二叉树的指针问题

c++ - 在 C++ 类中,使用 "this"访问成员变量有什么区别

go - golang如何构建lib来保护源代码?

pointers - Golang 在另一个结构的方法中更改一个结构的值

arrays - 此方法的返回类型是切片还是借用数组?

将整数常量转换为指针

c++ - 有人可以为我解释这个函数的最后一个参数吗?

javascript - 切片 blob 时无法设置正确的 MIME 类型

go - 将任意JSON发送到 gorilla websocket连接

go - 将自纪元以来的时间转换为十六进制或字节数组