我的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
- 1 回答
- 0 關注
- 180 瀏覽
添加回答
舉報
0/150
提交
取消