go的小白朋友对于 for select 中的break,可能会觉得迷惑。直接上干货~
func main() {
s1 := make(chan int, 10)
go func() {
for {
time.Sleep(1 * time.Second)
s1 <- 1
}
}()
i := 1
for ; i < 4; i++ {
fmt.Println("=== times := %d", i)
select {
case _ = <-s1:
if i == 2 {
fmt.Println(" break")
break
} else {
fmt.Println(" not break")
}
}
}
fmt.Println("===out of for ===")
time.Sleep(time.Second * 100)
}
你可能以为 在 i == 2 时,会跳出 for 循环。 But: i >2,for 代码块,依然会执行
=== times := %d 1
not break
=== times := %d 2
break
=== times := %d 3
not break
===out of for ===
----------------------------------------------------------------------------------------------
那如何达到,满足条件时,跳出for 循环呢?有2个方法:
1、添加 lable
i := 1
skip:
for ; i < 10; i++ {
fmt.Println("=== times := %d", i)
select {
case _ = <-s1:
if i == 6 {
fmt.Println(" break skip")
break skip
} else {
fmt.Println(" not break")
}
}
}
2、select 外层添加break
i := 1
isBreak := false
for ; i < 10; i++ {
fmt.Println("=== times := %d", i)
select {
case _ = <-s1:
if i == 6 {
fmt.Println(" break")
isBreak = true
break
} else {
fmt.Println(" not break")
}
}
if isBreak{
break
}
}