pointers - 切片和指针的范围
问题描述
我在特定结构的切片上有以下范围:
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
我可以进行计算,因为两个指针都指向不同的对象。
解决方案
应用程序正在获取变量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
}
}
推荐阅读
- amazon-cloudwatch - Cloudwatch 洞察查询修改
- java - 以编程方式导入 Wifi 代理设置 PAC 文件
- haskell - GHCI 怎么可能显示比我实际拥有的更大价值的内存?
- python - 如何使用 settings.configure() 来使用特定的应用程序设置
- apache-spark - 在远程纱线集群上提交作业需要哪些特定属性
- angular - 错误 TS2583:找不到名称“地图”。您需要更改目标库吗?尝试将 `lib` 编译器选项更改为 es2015 或更高版本
- sql - SQL - 如何分组然后连接连接?
- python - Python:比较具有不同 bin 大小的直方图
- entity-framework - 是否可以将表 FK 链接到实体框架中的 2 个其他 PK?
- weblogic12c - 不支持请求方法类型:ATG 中的 OPTIONS