Как правильно вернуть ошибку?

Есть задача: "Напишите функцию ReadCSV(file string) (<-chan []string, error) для чтения csv-файлов. В выходной канал должны передаваться строки из файла. Если возникла ошибка, верните ее описание." Вот мой код:

package main

import (
    "encoding/csv"
    "os"
    "io"
)

func ReadCSV(file string) (<-chan []string, error) {
    f, err := os.Open(file)
    if err != nil {
        return nil, err
    }
    defer f.Close()

    out := make(chan []string)

    go func() {
        defer close(out)
        reader := csv.NewReader(f)
        for {
            record, err := reader.Read()
            if err == io.EOF {
                break
            }
            if err != nil {
                return
            }
            out <- record
        }
    }()

    return out, nil
}

Как мне тут возвращать ошибку из горутины? Я не понимаю, объясните пожалуйста.


Ответы (1 шт):

Автор решения: Collapse

Как вариант, использовать что-то вроде пайплайна для обработки каналов и с помощью select читать оба Ваших канала, в таком случае если будет ошибка, то отработает case который читает ошибку, в ином случае отработает канал из которого Вы ожидаете данные.

select {
case <-data:
    println("Получили данные")
    return
case <-errChan:
     println("Получили ошибку")
     return
}
→ Ссылка