背景: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.
私はこれが何かであると仮定していますが、ポインタは常に割り当てられていますが、私は精神的なブロックが進行しており、問題の内容を正確に把握することはできません。誰かがここで起こっていることを説明できますか?
さらに、Ainar-Gによると、すべてのポインタは同じで、同じ変数を指しています。あなたは本当にあなたのロジックを真っ直ぐにしてください。 – Volker
最初は 'now'がループ内で宣言されていました。私は他の方法を試している間にそれを外に移動しましたが、問題はループと一緒にそれが働いていた値をコピーしていることを認識しませんでした。 – Leylandski