Я очень новичок в Go, поэтому, возможно, я неправильно понимаю что-то фундаментальное в асинхронной/потоковой обработке Go, но вот...
Я пытаюсь написать несколько тестов, используя ginkgo для написанной мной функции, которая обрабатывает потоки.
Сторона обработки читает текст с разделителями новой строки из файла до тех пор, пока не встретит специальную строку-разделитель, после чего она попытается проанализировать текст как JSON. Код выглядит следующим образом:
func ParseConfig(inStream *os.File) (Config, error){
var header string
var stdin = bufio.NewScanner(inStream)
for stdin.Scan() {
line := stdin.Text()
if line == "|||" {
break;
}
header += line
}
// parse JSON here and return
}
Мой тест выглядит примерно так
Describe("ParseConfig()", func() {
It("should pass for a valid header", func(){
_, err := io.WriteString(stream, "{\"Key\": \"key\", \"File\": \"file\"}\n|||\n")
Expect(err).NotTo(HaveOccurred())
conf, err := parser.ParseConfig(stream)
Expect(err).NotTo(HaveOccurred())
Expect(conf.Key).To(Equal("key"))
})
})
К сожалению, это приводит к ошибке синтаксического анализа JSON, поскольку он пытается проанализировать пустую строку. Я предполагаю, что моя проблема в том, что я отправляю строку в поток до того, как я сказал функции ParseConfig() прослушивать эту строку для данных? Но я не совсем понимаю, как я мог реорганизовать это, чтобы использовать правильные процедуры go, чтобы сначала прослушивать данные, а затем отправлять их.
Некоторые из потенциальных решений, которые я видел, были связаны с использованием «каналов» (с которыми я не знаком), но я был обеспокоен тем, что эта потребность может не стоить серьезного рефакторинга для введения совершенно новой парадигмы параллелизма.
Спасибо!