是什么导致了 Go 中的这个段错误?

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)

我假设这是什么做不断被重新分配给指针,但我有心理障碍怎么回事,我想不通的问题到底是什么。有人可以解释一下这里发生了什么吗?

Ain*_*r-G 5

在您的循环中,您复制每个Timekeeper值。改为这样做:

for i := range t {
    now = time.Now()
    t[i].myTime = &now
}
Run Code Online (Sandbox Code Playgroud)