go語言中如何使用select的實現(xiàn)示例_第1頁
go語言中如何使用select的實現(xiàn)示例_第2頁
go語言中如何使用select的實現(xiàn)示例_第3頁
go語言中如何使用select的實現(xiàn)示例_第4頁
go語言中如何使用select的實現(xiàn)示例_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第go語言中如何使用select的實現(xiàn)示例目錄1.基本語法2.select語句的實際應(yīng)用在golang語言中,select語句就是用來監(jiān)聽和channel有關(guān)的IO操作,當IO操作發(fā)生時,觸發(fā)相應(yīng)的case動作。

有了select語句,可以實現(xiàn)main主線程與goroutine線程之間的互動。

1.基本語法

select{

case-ch1://檢測有沒有數(shù)據(jù)可讀

//一旦成功讀取到數(shù)據(jù),則進行該case處理語句

casech2-1://檢測有沒有數(shù)據(jù)可寫

//一旦成功向ch2寫入數(shù)據(jù),則進行該case處理語句

default:

//如果以上都沒有符合條件,那么進入default處理流程

注意事項

select語句只能用于channel信道的IO操作,每個case都必須是一個信道。如果不設(shè)置default條件,當沒有IO操作發(fā)生時,select語句就會一直阻塞;如果有一個或多個IO操作發(fā)生時,Go運行時會隨機選擇一個case執(zhí)行,但此時將無法保證執(zhí)行順序;對于case語句,如果存在信道值為nil的讀寫操作,則該分支將被忽略,可以理解為相當于從select語句中刪除了這個case;對于空的select語句,會引起死鎖;對于在for中的select語句,不能添加default,否則會引起cpu占用過高的問題;

(1)多個IO操作發(fā)生時,case語句是隨機執(zhí)行的

funcmain()

{

ch1:=make(chanint,1)

//創(chuàng)建一個長度帶緩沖的整型通道

ch1-1

//向通道中寫入數(shù)據(jù)

ch2:=make(chanint,1)

ch2-2

select{

case-ch1:

fmt.Println("ch1read")

case-ch2:

fmt.Println("ch2read")

}

}

多次執(zhí)行后,會隨機打印ch1read或ch2read

(2)空select語句

funcmain(){

select{

執(zhí)行后,引發(fā)死鎖,打印如下:

fatalerror:allgoroutinesareasleep-deadlock!

goroutine1[select(nocases)]:

main.main()

xxx/test.go:4+0x27

exitstatus2

(3)for中的select引起CPU資源消耗過高

funcmain()

{

quit:=make(chanbool)

gofunc(){

for{

select{

case-quit:

fmt.Println("quit")

//使用return就會退出整個goroutine線程;如果使用break,程序仍然在for循環(huán)中執(zhí)行

return

default:

fmt.Println("default")

}

}

}()

time.Sleep(3*time.Second)

quit-true

//主線程在3秒后,向quit信道寫入數(shù)據(jù)

time.Sleep(2*time.Second)

fmt.Println("main")

}

在for{}的select語句中使用了default后,線程就會無限執(zhí)行default條件,直到quit信道中讀到數(shù)據(jù),否則會一直在一個死循環(huán)中運行,從而導(dǎo)致占滿整個CPU資源。

在for{}的select語句中,不建議使用default條件。

2.select語句的實際應(yīng)用

(1)實現(xiàn)main主線程與goroutine線程之間的交互、通信

//通過控制臺輸入"bye",來控制main函數(shù)結(jié)束運行

funcmain()

{

quit:=make(chanbool)

ch:=make(chanstring)

gofunc(){

for{

select{

casename:=-ch:

fmt.Printf("frommainmsg:[%v]\n",name)

ifname=="bye"{

quit-true

}else{

quit-false

}

}

}

}()

for{

//控制臺輸入

fmt.Print("pleaseinputstring:")

scanner:=bufio.NewScanner(os.Stdin)

scanner.Scan()

ch-scanner.Text()

isOver:=-quit

ifisOver{

break

}

}

fmt.Println("mainover")

}

運行:

frommainmsg:[aaa]

pleaseinputstring:bbb

frommainmsg:[bbb]

pleaseinputstring:bye

frommainmsg:[bye]

mainover

(2)超時實現(xiàn)

funcmain()

{

quit:=make(chanbool)

ch:=make(chanint)

gofunc(){

for{

select{

casenum:=-ch:

fmt.Println("num=",num)

case-time.After(5*time.Second):

fmt.Println("超時")

quit-true

}

}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論