背景:由于Go的内置JSON编组程序在给出omitempty
标记时未检查零值,因此我们尝试使用*time.Time
而不是{{1}在需要为JSON干净地编组的结构中。这个问题显然我们需要非常小心,在使用它时总是检查它不是零。我们注意到的一件事是在一个函数中设置包含结构的创建时间,当我们检查数据库中的JSON时,所有时间都完全相同,直到纳秒。
要检查这是否与指针有关,或者仅仅因为系统运行良好,我做了this test:
time.Time
但它不断产生这种恐慌:
package main
import (
"fmt"
"time"
)
type Timekeeper struct {
myTime *time.Time
}
func main() {
t := make([]Timekeeper, 100)
var now time.Time
for _, v := range t {
now = time.Now()
v.myTime = &now
time.Sleep(1 * time.Second)
}
for i, times := range t {
fmt.Printf("Timekeeper %s time: %s.", i, times.myTime.Format(time.RFC3339Nano))
}
}
我假设这是某事与指针不断重新分配,但我有一个心理障碍正在进行,我无法确切地知道问题是什么。有人可以解释一下这里发生了什么吗?
答案 0 :(得分:3)
在循环中复制每个Timekeeper
值。这样做:
for i := range t {
now = time.Now()
t[i].myTime = &now
}