Ревью: запись под мьютексом в небуферизированный канал с сигналом через done

Код-ревьюMiddle10 минпроверка — Спринт10-t042

Несколько горутин под мьютексом пишут строку в небуферизированный канал (буфер по условию запрещён). Отдельная горутина ждёт WaitGroup и закрывает done. Главная горутина в цикле select читает канал или выходит по done. Корректна ли программа? Что лишнее и как написать проще?

Как на собесе: 10 минут, ищи всё — гонки, утечки, ошибки, безопасность, стиль. Ссылайся на строки.

review.gogo
1package main2 3import (4	"fmt"5	"sync"6)7 8func main() {9	grp := sync.WaitGroup{}10	out := make(chan string) // буфер запрещён11	lock := sync.Mutex{}12	done := make(chan struct{})13 14	for i := 0; i < 5; i++ {15		grp.Add(1)16		go func(g *sync.WaitGroup, idx int) {17			defer g.Done()18 19			lock.Lock()20			out <- fmt.Sprintf("worker %d", idx)21			lock.Unlock()22		}(&grp, i)23	}24 25	go func() {26		grp.Wait()27		close(done)28	}()29 30	for {31		select {32		case s, ok := <-out:33			if !ok {34				out = nil35			}36			fmt.Println(s)37		case <-done:38			return39		}40	}41}
⌘ Enter — проверить