вот такую незамысловатую программу - хочу чтоб две горутины передавали друг другу значение. делаю два канала без буфера, и у меня выпадает дэдлок. а с буфером в два значения этой проблемы больше нет. почему так?
по моей логике посиходит следующее:
1. отправляется в канал а значение, канал б пустой
2. идет race condition, какая горутина запустится первой, но это совсем не важно, потому что первой все равно заработает та, которая первая ждет канал а. горутина с каналом б ждет
3. как только исполняется горутина, которая ждет канал а, она передает знаечние в канал б и потом горутина с каналом б начинает работать.
пс сорри за много букв
псс знаю что пользоваться слипом не надо, но это просто пример
package main
import (
"fmt"
"time"
)
func main() {
a := make(chan int, 2) // Почему работает с 2, а с 1 не работает??
b := make(chan int, 2) // Почему работает с 2, а с 1 не работает??
var i int
a <- i
go func() {
for {
i = <-a
fmt.Println("b:", i)
i++
b <- i
}
}()
go func() {
for {
i = <-b
fmt.Println("a:", i)
i++
a <- i
}
}()
time.Sleep(10 * time.Second)
}
у меня нет паники при буфере 1
а если в обоих каналах 1?
Обсуждают сегодня