Конкурентность несколько вопросов?
Не надо ничего разбивать. Создай канал, в который будешь построчно писать строки из файла, так же создай воркеры, которые будут читать из этого канала и что-то делать с этой строкой, по окончании результат передавать в другой канал, для финальной обработки. Из этого последнего канала читает только один ридер и пишет в твою структуру Data.
Накидал примерчик, если что, спрашивай
Andrey Tsvetkov,
Хорошо, спасибо за поддержку! Детальнее разберу твой пример для ясности.
<-- After some time -->
К сожалению твой пример вывалился с фатальной ошибкойfatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
        c:/Users/chapplin/go/src/example1/test.go:59 +0x3cf

goroutine 18 [chan receive]:
main.writer(0xc04202c0c0, 0xc042050070)
        c:/Users/chapplin/go/src/example1/test.go:23 +0x5e
created by main.main
        c:/Users/chapplin/go/src/example1/test.go:37 +0xf0
exit status 2
Для продолжения нажмите любую клавишу . . .
Но потом, закоментил последнюю строчку// <- done
Код отработал без ошибок.
Тут вот дополнительный вопрос, по видимому sigfault в бесконечном цикле:func writer(result <- chan string, done chan bool) {
	for line := range result {
		fmt.Println(line)
	}
	done <- true
}
Может необходимо дополнительную проверку, и выходить по break из цикла, типа такого:func writer(result <- chan string, done chan bool) {
	for line := range result {
        if (<- done) == true {
            break
        }
		fmt.Println(line)
	}
	done <- true
}
И в завершении программы уже делать done <- true
И зачем вообще этот done нужен, если он определен а явного использования нет?