2016-12-21 10 views
0

背景:omitemptyフラグが与えられている場合、Goの組み込みJSONマーシャラーはゼロ値をチェックしないため、time.Timeではなく*time.TimeをJSONに完全にマーシャリングする必要があります。この問題は明らかに、使用時にはそれがゼロではないことを常に確認するように注意する必要があります。私たちが気付いたことは、包括的な構造体の作成時間を設定する関数にありました。データベースのJSONをすべてチェックしたとき、すべての時間が全く同じで、ナノ秒になりました。Goでこのsegfaultの原因は何ですか?

これはポインタに何かあったか、またはシステムが非常によく行っていたという理由だけで、私はthis testをしたかどうかを確認するには、次の

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)) 
    } 

} 

が、それはこのパニックを生産し続ける:

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. 

私はこれが何かであると仮定していますが、ポインタは常に割り当てられていますが、私は精神的なブロックが進行しており、問題の内容を正確に把握することはできません。誰かがここで起こっていることを説明できますか?

+0

さらに、Ainar-Gによると、すべてのポインタは同じで、同じ変数を指しています。あなたは本当にあなたのロジックを真っ直ぐにしてください。 – Volker

+0

最初は 'now'がループ内で宣言されていました。私は他の方法を試している間にそれを外に移動しましたが、問題はループと一緒にそれが働いていた値をコピーしていることを認識しませんでした。 – Leylandski

答えて

3

ループでは、すべてTimekeeperの値をコピーします。

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

これは私が作っていて間違えているようだが、1ヶ月後に再び作り直す。私はhttps://play.golang.orgが10/11/09だと思っているので、固定されたバージョンを投稿することはできません。 – Leylandski

関連する問題