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

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

通過 for 循環的 goroutine 通道

通過 for 循環的 goroutine 通道

Go
達令說 2021-10-18 11:08:30
我的main函數從文件中讀取 json,將其解組為結構體,將其轉換為另一種結構體類型并通過標準輸出輸出格式化的 JSON。我正在嘗試實現 goroutines 和通道來為我的for循環添加并發性。func main() {    muvMap := map[string]string{"male": "M", "female": "F"}    fileA, err := os.Open("serviceAfileultimate.json")    if err != nil {        panic(err)    }    defer fileA.Close()    data := make([]byte, 10000)    count, err := fileA.Read(data)    if err != nil {        panic(err)    }    dataBytes := data[:count]    var servicesA ServiceA    json.Unmarshal(dataBytes, &servicesA)    var servicesB = make([]ServiceB, servicesA.Count)    goChannels := make(chan ServiceB, servicesA.Count)    for i := 0; i < servicesA.Count; i++ {        go func() {            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Address").SetString(Merge(&servicesA.Users[i].Location))            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Date_Of_Birth").SetString(dateCopyTransform(servicesA.Users[i].Dob))            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Email").SetString(servicesA.Users[i].Email)            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Fullname").SetString(Merge(&servicesA.Users[i].Name))            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Gender").SetString(muvMap[servicesA.Users[i].Gender])            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Phone").SetString(servicesA.Users[i].Cell)            reflect.ValueOf(&servicesB[i]).Elem().FieldByName("Username").SetString(servicesA.Users[i].Username)            goChannels <- servicesB[i]        }()    }    for index := range goChannels {        json.NewEncoder(os.Stdout).Encode(index)    }}它編譯但返回如下消息:goroutine 1 [chan receive]: main.main() C://.....go.94 +0x55b.
查看完整描述

1 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

您正在打印頻道信息,而不是它包含的數據。你不想要一個循環,你只想接收然后打印。


   json := <-index

   json.NewEncoder(os.Stdout).Encode(json)

現在我需要指出的是,該代碼不會阻塞。如果您想繼續閱讀直到所有工作完成,您需要某種鎖定/協調機制。


你會經??吹筋愃频臇|西


for {

   select {

        case json := <-jsonChannel:

            // do stuff

        case <-abort:

            // get out of here 

   }

}

去處理那個。此外,僅供參考,您正在使用默認容量(意味著它是一個緩沖的頻道)初始化您的頻道,這很奇怪。我建議查看有關該主題的一些教程,因為總體而言,您的設計需要一些工作,實際上是對非并發實現的改進。最后,您可以找到一些庫來為您抽象這些工作,大多數人可能會建議您這樣做。這是一個例子;https://github.com/lytics/squaredance


查看完整回答
反對 回復 2021-10-18
  • 1 回答
  • 0 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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