亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

恐慌:運行時錯誤:無效的內存地址或更大數據的 nil 指針取消引用

恐慌:運行時錯誤:無效的內存地址或更大數據的 nil 指針取消引用

Go
UYOU 2022-06-21 15:58:21
我正在使用 Apache Prediction IO 開發推薦引擎。在事件服務器之前,我有一個 GO api,用于偵聽來自客戶和進口商的事件。在客戶使用導入器的特定情況下,我收集導入的身份,并將 json 從導入器 api 發送到 GO api。例如,如果用戶導入一個包含 45000 個數據的 csv,我會將這 45000 個身份以 json 格式發送到 GO api,例如{"barcodes":[...]}. 預測 IO 事件服務器需要特定形狀的數據。type ItemEvent struct {    Event      string              `json:"event"`    EntityType string              `json:"entityType"`    EntityId   string              `json:"entityId"`    Properties map[string][]string `json:"properties"`    EventTime  time.Time           `json:"eventTime"`}type ItemBulkEvent struct {    Event     string    `json:"event"`    Barcodes []string  `json:"barcodes"`    EventTime time.Time `json:"eventTime"`}ItemEvent是我將從 GO Api 發送到事件服務器的最終數據。ItemBulkEvent是我從進口商 api 收到的數據。func HandleItemBulkEvent(w http.ResponseWriter, r *http.Request) {    var itemBulk model.ItemBulkEvent    err := decode(r,&itemBulk)    if err != nil {        log.Fatalln("handleitembulkevent -> ",err)        util.RespondWithError(w,400,err.Error())    }else {        var item model.ItemEvent        item.EventTime = itemBulk.EventTime; item.EntityType = "item"; item.Event = itemBulk.Event        itemList := make([]model.ItemEvent,0,50)        for index, barcode := range itemBulk.Barcodes{            item.EntityId = barcode            if (index > 0 && (index % 49) == 0){                itemList = append(itemList, item)                go sendBulkItemToEventServer(w,r,itemList)HandleItemBulkEvent是批量更新的處理函數。在這一步中,我應該提到預測 io 的批量上傳。通過 rest api 預測 io 事件服務器每個請求需要 50 個事件。所以我創建了一個包含 50 個上限和一個項目的列表。我使用相同的項目,只是每次都更改身份部分(條形碼)并添加到列表中。在每 50 個項目中,我使用了一個處理函數,將該列表發送到事件服務器,然后清理列表,依此類推。sendBulkItemToEventServer函數編組傳入的項目列表并向預測 io 的事件服務器發出發布請求。在這部分中,當我嘗試使用 5000+- 項目時,它做得很好,但是當我嘗試使用 45000 項目時,應用程序崩潰并出現以下錯誤。知道如何解決這個問題嗎?
查看完整描述

2 回答

?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

您的程序中有幾個錯誤。運行時錯誤是因為您正在檢查 if err2is not nil,但是您正在打印err,而不是err2err為零,因此運行時錯誤。

這意味著err2不是零,所以你應該看到那個錯誤是什么。

您提到您正在分批發送 50 條消息,但該實現是錯誤的。您將元素添加到itemList,然后用 that 啟動一個 goroutine itemList,然后截斷它并再次開始填充。這是一場數據競賽,你的 goroutine 將看到itemList處理程序正在修改的實例。無需截斷,只需itemList在向 goroutine 提交一個時創建一個新的,這樣每個 goroutine 都可以擁有自己的副本。

如果您想繼續使用相同的切片,您可以編組切片,然后將 JSON 消息傳遞給 goroutine 而不是切片。


查看完整回答
反對 回復 2022-06-21
?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

您收到的錯誤是您發出請求的服務器發送的錯誤。查看內容以了解有關該錯誤的更多信息。

很可能是以下 for 循環

for index, barcode := range itemBulk.Barcodes{

迭代次數過多,并且因為您使用單獨的 go 例程來創建請求,所有請求同時發生,這會導致服務器過載或故意關閉連接。


查看完整回答
反對 回復 2022-06-21
  • 2 回答
  • 0 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號