Sobes.tech
Back to questions
Senior
6

func main() { c := make(chan int, 1000) var wg sync.WaitGroup wg.Add(100) for i := 0; i < 100; i++ { go func() { defer wg.Done() foo(c) }() } go func() { wg.Wait() close(c) }() sum := 0 for r := range c { sum += r } // fmt.Println(sum) } func foo_req(c chan int) error { r := rand.Int() for i := 0; i < r; i++ { c <- r } }

Companies where asked
plata

Answer from AI

sobes.tech AI

В представленном коде есть несколько проблем:

  1. В функции foo_req (в коде вызывается foo, но определена foo_req) происходит запись в канал c в цикле от 0 до r, где r — случайное число. Это может привести к блокировке, если буфер канала переполнится, так как канал буферизирован на 1000 элементов, а r может быть больше.

  2. В горутине, которая запускает foo, не передается параметр i, но это не критично, так как i не используется внутри.

  3. В функции foo_req нет возврата ошибки, хотя объявлено error.

  4. В main происходит корректное ожидание завершения всех горутин через WaitGroup и закрытие канала.

Чтобы избежать блокировок, нужно убедиться, что количество отправляемых в канал элементов не превышает его буфер, либо использовать неблокирующую отправку или дополнительную синхронизацию.

Пример исправления функции foo:

func foo(c chan int) {
    r := rand.Intn(1000) // ограничим максимум
    for i := 0; i < r; i++ {
        c <- r
    }
}

Или использовать неблокирующую отправку с select:

func foo(c chan int) {
    r := rand.Intn(1000)
    for i := 0; i < r; i++ {
        select {
        case c <- r:
        default:
            // канал полон, можно обработать ситуацию
        }
    }
}

Также стоит проверить, что rand инициализирован, и исправить несоответствие имен функций.