2 回答

TA貢獻(xiàn)1886條經(jīng)驗 獲得超2個贊
問題
原因很簡單:
var dataGrouped DataGroupedByTS
將 的字段初始化dataGrouped為類型 的所謂零值DataGroupedByTS。
任何復(fù)合類型的零值T都由與 的每個字段對應(yīng)的類型的零值組成T。
因此對于
type DataGroupedByTS struct {
CodeConv string `json:"codeConv"`
Start time.Time `json:"start"`
End time.Time `json:"end"`
Details []struct {
Timestamp time.Time `json:"timestamp"`
Keys []struct {
IDPrm string `json:"idPrm"`
Value float64 `json:"value"`
} `json:"keys"`
} `json:"details"`
}
零值是
type DataGroupedByTS struct {
CodeConv: "",
Start: time.Time(0),
End: time.Time(0),
Details: nil, // watch this!
}
這是因為 的類型Details是[]struct{ ... },即某些結(jié)構(gòu)體的切片,并且任何切片的零值都是nil。
然后,您繼續(xù)嘗試在某個索引處寫入不存在的切片(好吧,該切片沒有分配任何后備數(shù)組來保存其數(shù)據(jù))。這會合理地失敗,并出現(xiàn)“恐慌:運行時錯誤:索引超出范圍”:未分配的切片有零個元素,因此索引 0 處沒有元素,并且沒有任何可分配的內(nèi)容。
修復(fù)
兩種方式:
預(yù)分配目標(biāo)切片:
var dataGrouped DataGroupedByTS
// ...
dataGrouped.Details = make([]struct{...}, len(apiMain.Details))
for _, detail := range apiMain.Details {
// ...
追加到切片,而不是就地更新其元素:
var dataGrouped DataGroupedByTS
// ...
for _, detail := range apiMain.Details {
dataGrouped.Details = append(dataGrouped.Details, detail)
// ...
append切片就可以了nil。

TA貢獻(xiàn)2021條經(jīng)驗 獲得超8個贊
我的兩分錢:請問該對象是否為空,因為恐慌錯誤明確表示“索引超出范圍”,并檢查 for 循環(huán)中的下邊界和上邊界。
- 2 回答
- 0 關(guān)注
- 245 瀏覽
添加回答
舉報