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

时间:2016-12-21 11:04:25

标签: pointers go segmentation-fault

背景:由于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))
    }

}

我假设这是某事与指针不断重新分配,但我有一个心理障碍正在进行,我无法确切地知道问题是什么。有人可以解释一下这里发生了什么吗?

1 个答案:

答案 0 :(得分:3)

在循环中复制每个Timekeeper值。这样做:

for i := range t {
    now = time.Now()
    t[i].myTime = &now
}