我正在嘗試同時處理文件中的行,但出于某種原因,我似乎得到了不一致的結果。我的代碼的簡化版本如下: var wg sync.WaitGroup semaphore := make(chan struct{}, 2) lengths:= []int{} for _, file := range(args[1:]){ // Open the file and start reading it reader, err := os.Open(file) if err != nil { fmt.Println("Problem reading input file:", file) fmt.Println("Error:", err) os.Exit(0) } scanner := bufio.NewScanner(reader) // Start streaming lines for scanner.Scan() { wg.Add(1) text := scanner.Text() semaphore <- struct{}{} go func(line string) { length := getInformation(line) lengths = append(lengths, length) <-semaphore wg.Done() }(text) } } wg.Wait() sort.Ints(lengths) fmt.Println("Lengths:", lengths)該getInformation函數只是返回行的長度。然后我把那條線添加到一個數組中。我遇到的問題是,當我對同一個文件多次運行時,我在數組中得到了不同數量的項目。我曾假設,因為我使用的waitGroup是每次都會處理所有行,因此內容lengths是相同的,但事實并非如此。誰能看到我在這里做錯了什么?
1 回答

ITMISS
TA貢獻1871條經驗 獲得超8個贊
正在lengths = append(lengths, length)
同時執行。這是不安全的,會導致切片丟失條目等問題。您可以通過將追加調用包裝在互斥鎖中來解決此問題,或者讓 gorountines 將它們的結果發布到一個通道并有一個地方將它們收集到一個切片中。
- 1 回答
- 0 關注
- 127 瀏覽
添加回答
舉報
0/150
提交
取消