Ley*_*ski 3 pointers go segmentation-fault
背景:因为 Go 的内置 JSON 编组器在给定omitempty标志时不会检查零值,所以我们正在尝试使用*time.Time而不是time.Time在需要干净地编组为 JSON 的结构中使用。这个问题显然是我们需要非常小心,在使用它时总是检查它是否为空。我们注意到的一件事是在包含结构体上设置创建时间的函数中,当我们检查数据库中的 JSON 时,所有时间都完全相同,精确到纳秒。
为了检查这是否与指针有关,还是仅仅因为系统运行良好,我进行了以下测试:
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))
}
}
Run Code Online (Sandbox Code Playgroud)
但它不断产生这种恐慌:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0x20314]
goroutine 1 [running]:
panic(0x112c00, 0x1040a038)
/usr/local/go/src/runtime/panic.go:500 +0x720
main.main()
/tmp/sandbox675251439/main.go:23 +0x314
Program exited.
Run Code Online (Sandbox Code Playgroud)
我假设这是什么做不断被重新分配给指针,但我有心理障碍怎么回事,我想不通的问题到底是什么。有人可以解释一下这里发生了什么吗?
在您的循环中,您复制每个Timekeeper值。改为这样做:
for i := range t {
now = time.Now()
t[i].myTime = &now
}
Run Code Online (Sandbox Code Playgroud)