第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

go 中轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu):panic: 運行時錯誤:索引超出范圍

go 中轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu):panic: 運行時錯誤:索引超出范圍

Go
吃雞游戲 2023-07-10 14:27:11
我在 go 中有一個數(shù)據(jù)結(jié)構(gòu):type APIMain struct {    CodeConv string    `json:"codeConv"`    Start    time.Time `json:"start"`    End      time.Time `json:"end"`    Details  []struct {        IDPrm string `json:"idPrm"`        Keys  []struct {            Timestamp time.Time `json:"timestamp"`            Value     float64   `json:"value"`        } `json:"keys"`    } `json:"details"`}我需要將其轉(zhuǎn)換為: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"`}我得到: panic: runtime error: index out of range這是我的方法,但它在循環(huán)的第一行失敗:func groupByTimestamp(apiMain datacheck.APIMain) DataGroupedByTS {    var dataGrouped DataGroupedByTS    dataGrouped.CodeConv = apiMain.CodeConv    dataGrouped.Start = apiMain.Start    dataGrouped.Start = apiMain.Start    dataGrouped.End = apiMain.End    var iDetail = 0    var iKey = 0    for _, detail := range apiMain.Details {        for _, key := range detail.Keys {            dataGrouped.Details[iDetail].Timestamp = key.Timestamp  // <-- failing here            dataGrouped.Details[iDetail].Keys[iKey].IDPrm = detail.IDPrm            dataGrouped.Details[iDetail].Keys[iKey].Value = key.Value            iKey++        }        iDetail++    }    return dataGrouped}基本上,數(shù)據(jù)最初按 分組IDPrm,我需要按時間戳對其進(jìn)行分組。我該怎么做呢?有沒有幫手可以幫忙做這件事?
查看完整描述

2 回答

?
MM們

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。



查看完整回答
反對 回復(fù) 2023-07-10
?
寶慕林4294392

TA貢獻(xiàn)2021條經(jīng)驗 獲得超8個贊

我的兩分錢:請問該對象是否為空,因為恐慌錯誤明確表示“索引超出范圍”,并檢查 for 循環(huán)中的下邊界和上邊界。



查看完整回答
反對 回復(fù) 2023-07-10
  • 2 回答
  • 0 關(guān)注
  • 245 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號