Я начну с того, что прохождение всех проверок на ошибки для функции перед возвратом, даже если они терпят неудачу, является чем-то вроде запаха кода.Это может означать, что у вас происходит что-то странное, и может быть лучший способ выполнить то, что вы пытаетесь сделать.
Однако, при условии, что вы свалили свою проблемук этому, тогда я вижу два варианта, в зависимости от того, как ошибки должны быть обработаны.
Если ошибки могут быть обработаны один за другим и на самом деле не полагаются друг на друга, то вы можете простосоздайте канал ошибок и отправляйте их по одному, когда вы обнаружите ошибки.См. Следующий рабочий пример:
package main
import (
"errors"
"fmt"
"strings"
)
func main() {
errCh := make(chan error)
go HandleErrorsSerially("bad error", errCh)
for err := range errCh {
fmt.Printf("Found error serially: %v\n", err)
}
}
func HandleErrorsSerially(msg string, errCh chan<- error) {
if strings.Contains(msg, "error") {
errCh <- errors.New("message contained string 'error'")
}
if strings.Contains(msg, "bad") {
errCh <- errors.New("message contained string 'bad'")
}
close(errCh)
}
В качестве альтернативы, если вам необходимо просмотреть все ошибки, которые произошли одновременно (так как две ошибки, возникающие одновременно, могут указывать на некоторые особые обстоятельства), то у вас будетдобавить их все в массив, а затем передать их через канал.Смотрите следующий рабочий пример:
package main
import (
"errors"
"fmt"
"strings"
)
func main() {
errArrCh := make(chan []error)
go HandleErrorsTogether("bad error", errArrCh)
errArr := <-errArrCh
fmt.Printf("Found the following errors together: %v\n", errArr)
}
func HandleErrorsTogether(msg string, errArrCh chan<- []error) {
errArr := make([]error, 0)
if strings.Contains(msg, "error") {
errArr = append(errArr, errors.New("message contained string 'error'"))
}
if strings.Contains(msg, "bad") {
errArr = append(errArr, errors.New("message contained string 'bad'"))
}
errArrCh <- errArr
close(errArrCh)
}