Экспериментируя с Golang, я создал функцию с оператором select, которая слушает два канала.
Моя проблема в том, что код, кажется, ведет себя недетерминированно - иногда он паникует, а иногда и успешно завершается.
Я ожидаю, что этот код всегда должен вызывать пани c. Сначала он должен получить сообщение об ошибке, потому что его следует отправить до завершения waitGroup. и, следовательно, прежде чем канал успеха будет переведен на.
package main
import (
"errors"
"fmt"
"sync"
)
func main() {
errs := make(chan error, 1)
success := make(chan bool, 1)
doSomething(success, errs)
select {
case err := <-errs:
fmt.Println("error", err)
panic(err)
case <-success:
fmt.Println("success")
}
fmt.Println("finished successfully")
}
func doSomething(success chan bool, errs chan error) {
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
err := errors.New("Some error")
errs <- err
}()
wg.Wait()
success <- true
}