go如何終止多個(gè)for select循環(huán)嵌套的方法
分類說明
for select循環(huán)嵌套,如何終止?上代碼:
stop := make(chan struct{})
go func() {
for i := 1; i < 3; i++ {
fmt.Println("writed ", i)
time.Sleep(time.Second * 1)
}
close(stop)
fmt.Println("stop closed.")
}()
go func() {
stop1:
for {
select {
case <-stop:
fmt.Println("recv 1")
break stop1
default:
fmt.Println("A 1 default...")
for {
select {
case <-stop:
fmt.Println("recv 2")
break stop1
default:
fmt.Println("A 2 default...")
time.Sleep(time.Second * 1)
}
}
}
}
fmt.Println("A 結(jié)束")
}()
fmt.Println("已關(guān)閉", stop == nil)
for i := 1; i < 10; i++ {
time.Sleep(time.Second * 1)
fmt.Println("ch==nil: ", stop == nil, " num=", runtime.NumGoroutine())
}如上,內(nèi)外均監(jiān)聽了stop,內(nèi)層接受到信號(hào)后直接終止stop1,全流程正常結(jié)束。效果如下:
speed running:
已關(guān)閉 false
A 1 default...
A 2 default...
writed 1
A 2 default...
writed 2
ch==nil: false num= 3
ch==nil: false num= 3
A 2 default...
stop closed.
recv 2
A 結(jié)束
ch==nil: false num= 1
ch==nil: false num= 1
ch==nil: false num= 1
ch==nil: false num= 1
ch==nil: false num= 1
ch==nil: false num= 1
ch==nil: false num= 1
換成先終止內(nèi)層也可:
stop := make(chan struct{})
go func() {
for i := 1; i < 3; i++ {
fmt.Println("writed ", i)
time.Sleep(time.Second * 1)
}
close(stop)
fmt.Println("stop closed.")
}()
go func() {
stop1:
for {
select {
case <-stop: // 這里也可收到信號(hào)
fmt.Println("recv 1")
break stop1
default:
fmt.Println("A 1 default...")
stop2:
for {
select {
case <-stop: // 這里可收到信號(hào)
fmt.Println("recv 2")
break stop2 // 換成終止內(nèi)層
default:
fmt.Println("A 2 default...")
time.Sleep(time.Second * 1)
}
}
fmt.Println("A 2 stop...")
}
}
fmt.Println("A 結(jié)束")
}()
fmt.Println("已關(guān)閉", stop == nil)
for i := 1; i < 10; i++ {
time.Sleep(time.Second * 1)
fmt.Println("ch==nil: ", stop == nil, " num=", runtime.NumGoroutine())
}如上代碼,在內(nèi)層先終止自己的邏輯stop2,外層也隨之終止,正常結(jié)束。效果如下:
speed running:
已關(guān)閉 false
writed 1
A 1 default...
A 2 default...
writed 2
ch==nil: false num= 3
A 2 default...
A 2 default...
ch==nil: false num= 3
stop closed.
recv 2
A 2 stop...
recv 1
A 結(jié)束
ch==nil: false num= 2
ch==nil: false num= 1
ch==nil: false num= 1
ch==nil: false num= 1
ch==nil: false num= 1
ch==nil: false num= 1
ch==nil: false num= 1
如果不是基于關(guān)閉操作而是寫入呢,內(nèi)層和外層都能收到嗎? 答:只會(huì)接收一次。
stop := make(chan struct{})
go func() {
for i := 1; i < 3; i++ {
//ch <- i
fmt.Println("writed ", i)
time.Sleep(time.Second * 1)
}
stop <- struct{}{}// close(stop)
fmt.Println("stop writed.")
}()
go func() {
stop1:
for {
select {
case <-stop: // 這里未收到信號(hào)
fmt.Println("recv 1")
break stop1
//case data := <-ch:
// fmt.Println("A data=", data)
default:
fmt.Println("A 1 default...")
stop2:
for {
select {
case <-stop: // 這里可收到信號(hào)
fmt.Println("recv 2")
break stop2 // 換成終止內(nèi)層
default:
fmt.Println("A 2 default...")
time.Sleep(time.Second * 1)
}
}
fmt.Println("A 2 stop...")
}
}
fmt.Println("A 結(jié)束")
}()
fmt.Println("stop == nil: ", stop == nil)
for i := 1; i < 10; i++ {
time.Sleep(time.Second * 1)
fmt.Println("ch==nil: ", stop == nil, " num=", runtime.NumGoroutine())
}
close(stop)
fmt.Println("stop已關(guān)閉, ", stop == nil)speed running:
stop == nil: false
writed 1
A 1 default...
A 2 default...
A 2 default...
writed 2
ch==nil: false num= 3
recv 2
A 2 stop...
A 1 default...
A 2 default...
stop writed.
ch==nil: false num= 3
ch==nil: false num= 2
A 2 default...
A 2 default...
ch==nil: false num= 2
ch==nil: false num= 2
A 2 default...
A 2 default...
ch==nil: false num= 2
A 2 default...
ch==nil: false num= 2
ch==nil: false num= 2
A 2 default...
A 2 default...
ch==nil: false num= 2
stop已關(guān)閉, false
總結(jié)
觸發(fā)條件需要全部結(jié)束時(shí),直接終止最外層for select 即可達(dá)到其下嵌套的所有該循環(huán)的目的。
到此這篇關(guān)于go如何終止多個(gè)for select循環(huán)嵌套的方法的文章就介紹到這了,更多相關(guān)go 終止循環(huán)嵌套內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于gin的golang web開發(fā)之認(rèn)證利器jwt
這篇文章主要介紹了基于gin的golang web開發(fā)之認(rèn)證利器jwt,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
GO web 數(shù)據(jù)庫預(yù)處理的實(shí)現(xiàn)
本文主要介紹了GO web 數(shù)據(jù)庫預(yù)處理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
在golang中使用Sync.WaitGroup解決等待的問題
這篇文章主要介紹了在golang中使用Sync.WaitGroup解決等待的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
Go利用反射reflect實(shí)現(xiàn)獲取接口變量信息
反射是通過實(shí)體對(duì)象獲取反射對(duì)象(Value、Type),然后可以操作相應(yīng)的方法。本文將利用Go語言中的反射reflect實(shí)現(xiàn)獲取接口變量信息,需要的可以參考一下2022-05-05

