Проверяет понимание конкурентности в Go и корректной работы с http.ResponseWriter из нескольких goroutine.
http.ResponseWriter не является потокобезопасным. Если несколько goroutine одновременно вызывают методы Write, WriteHeader или Header, это приводит к гонке данных. В результате ответ может быть поврежден, содержать перемешанные данные или вызвать панику в рантайме.
Когда хендлер возвращает управление, сервер считает ответ завершенным. Если goroutine продолжает писать в ResponseWriter после этого, данные могут быть потеряны или вызвать ошибку. Необходимо дожидаться завершения всех goroutine перед возвратом из хендлера.
func handler(w http.ResponseWriter, r *http.Request) {
go func() {
time.Sleep(2 * time.Second)
w.Write([]byte("Hello")) // гонка данных и запись после завершения хендлера
}()
w.Write([]byte("Start"))
}Используйте каналы или sync.WaitGroup для синхронизации. Например, можно записывать данные в буфер внутри goroutine, а затем передавать их в основной поток для записи в ResponseWriter.
func handler(w http.ResponseWriter, r *http.Request) {
ch := make(chan []byte)
go func() {
time.Sleep(2 * time.Second)
ch <- []byte("Hello")
}()
w.Write([]byte("Start"))
data := <-ch
w.Write(data)
}Используйте goroutine для параллельной обработки, но всегда синхронизируйте доступ к ResponseWriter. Лучше всего выполнять запись ответа только из одного места — основного потока хендлера.