Пробуя несколько экспериментов на каналах, я придумал следующий код:
var strChannel = make(chan string, 30)
var mutex = &sync.Mutex{}
func main() {
go sampleRoutine()
for i := 0; i < 10; i++ {
mutex.Lock()
strChannel <- strconv.FormatInt(int64(i), 10)
mutex.Unlock()
time.Sleep(1 * time.Second)
}
time.Sleep(10 * time.Second)
}
func sampleRoutine() {
/* A: for msg := range strChannel{*/
/* B: for {
msg := <-strChannel*/
log.Println("got message ", msg, strChannel)
if msg == "3" {
mutex.Lock()
strChannel = make(chan string, 20)
mutex.Unlock()
}
}
}
В основном здесь, при прослушивании данного канала, я назначаю переменную канала новому каналу в определенном состоянии (здесь, когда msg == 3).
Когда я использую код в блоке комментариев B, он работает как положено, то есть цикл переходит на вновь созданный канал и печатает 4-10.
Однако блок комментария A, который, как я считаю, является просто другим способом написания цикла, не работает, т. Е. После печати «3» он останавливается.
Может кто-нибудь сообщить мне причину такого поведения?
И есть ли такой код, когда обычное прослушивание канала создает новый сейф?