Мы не заходим во вторую ветку потому что 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")
}
}
}() //просто анонимная функция
}