@raiboon

Что тут проиходит?

for {
		select {
		case res := <-c1:
			fmt.Println(res)
		case <-time.After(time.Second * 10):
			break
		case <-time.After(time.Second * 1):
			fmt.Println("timeout 1")

		}

	}


Почему мы никогда не заходим во вторую ветку? Что тут происходит?

UPD Это мои игры с примером - https://gobyexample.com/non-blocking-channel-operations, я протсо добавил в первый select ещё одну ветку.
  • Вопрос задан
  • 421 просмотр
Решения вопроса 1
@SilentFl
Мы не заходим во вторую ветку потому что time.After нам создает канал. Соответственно, на каждой итерации первым приходит сигнал от time.After(1*time.Second), после чего идет следующая итерация цикла, и оба таймовских канала пересоздаются. Вынесите time.After(10*time.Second) перед цикл, чтобы он не пересоздавался каждую итерацию, и будет вам счастье. вот так:
package main

import (
	"fmt"
	"time"
)

func main() {
	c1 := make(chan struct{}, 10)
	time_limit := time.After(time.Second * 10)
Label1:
	for {
		select {
		case res := <-c1:
			fmt.Println(res)
		case <-time_limit:
			fmt.Println("time limit")
			break Label1
		case <-time.After(time.Second * 1):
			fmt.Println("timeout 1")
		}
	}
}

Примечание - Label1 нам здесь нужна в из-за того, что компилятор расценивает break как часть select'а (ведь break располагается в первую очередь в select'e, а уже потом в for'е. синтаксис break [label_name] позволяет указать кому прерываться.

Но лично мне этот label совсем не нравится (каким-то душком от него отдает, как в 70е года вернулись, того и гляди goto где-нить вылезет), и я бы написал этот код так:
package main

import (
	"fmt"
	"time"
)

func main() {
	c1 := make(chan struct{}, 10)
	time_limit := time.After(time.Second * 10)
	func() {
		for {
			select {
			case res := <-c1:
				fmt.Println(res)
			case <-time_limit:
				fmt.Println("time_limit")
				return
			case <-time.After(time.Second * 1):
				fmt.Println("timeout 1")
			}
		}
	}()  //просто анонимная функция
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы