我正在嘗試同時(shí)處理文件中的行,但出于某種原因,我似乎得到了不一致的結(jié)果。我的代碼的簡化版本如下: 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函數(shù)只是返回行的長度。然后我把那條線添加到一個(gè)數(shù)組中。我遇到的問題是,當(dāng)我對同一個(gè)文件多次運(yùn)行時(shí),我在數(shù)組中得到了不同數(shù)量的項(xiàng)目。我曾假設(shè),因?yàn)槲沂褂玫膚aitGroup是每次都會(huì)處理所有行,因此內(nèi)容lengths是相同的,但事實(shí)并非如此。誰能看到我在這里做錯(cuò)了什么?
1 回答

ITMISS
TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
正在lengths = append(lengths, length)
同時(shí)執(zhí)行。這是不安全的,會(huì)導(dǎo)致切片丟失條目等問題。您可以通過將追加調(diào)用包裝在互斥鎖中來解決此問題,或者讓 gorountines 將它們的結(jié)果發(fā)布到一個(gè)通道并有一個(gè)地方將它們收集到一個(gè)切片中。
- 1 回答
- 0 關(guān)注
- 136 瀏覽
添加回答
舉報(bào)
0/150
提交
取消