golang學習筆記 channel(2)

2022-04-11 06:02:55 字數 1469 閱讀 8628

channel容量為0和為1的區別

使用range來遍歷channel

使用for range來遍歷channel,會自動等待channel的操作,一直到channel被關閉,退出迴圈。

第乙個協程傳送完資料之後關閉channel,使用range遍歷讀取channel中的資料,當channel被關閉後會退出迴圈結束程式

package main

import (

"fmt"

"time"

)func main()

close(c)

}()//通過range來列印資料,直到channel被關閉

go func()

}()fmt.scanln() //使用了fmt.scanln()通過控制台輸入掃瞄來hold住控制台,不讓程式退出

fmt.println("完成")

}

關閉channel

關閉channel使用了內建的函式close,對於關閉channel需要注意如下幾點:

select

package main

import (

"fmt"

"time"

)func main()

close(c1)

}()go func()

close(c2)

}()//通過1個協程從2個channel中讀取資料,如果沒有資料則阻塞

go func()

} }()

fmt.scanln()

}

對於讀取已經關閉的channel時,可以使用返回值來判斷channel是否被關閉,下面的例子中如果返回的ok為false,就說明channel已經被關閉: 

select超時

在select中可以處理超時,超時在處理外部資源或需要繫結執行時間的程式非常重要,通過channel和select,在go中可以很容易且優雅的實現超時機制。在下面的例子使用乙個協程來模擬任務處理,利用sleep 5秒鐘來模擬任務執行時間,任務完成後向channel中寫入結果;在select語句中實現超時,第乙個case來讀取channel中的資料,等待結果寫入;第二個channel中使用time.after(3 * time.second)來等待3秒超時時間。由於實際任務執行時間是5秒鐘,超時時間是3秒鐘,所以等待3秒鐘後,time.after返回的channel中會寫入乙個時間,select語句就選擇第二個case執行,然後結束程式:

package main

import "time"

import "fmt"

func main() ()

select

}

輸出:開始時間 1595297994

timeout 3

Golang學習筆記

如果乙個method的receiver是 t,你可以在乙個t型別的例項變數v上面呼叫這個method,而不需要 v去呼叫這個method 即不需要 v method 如果乙個method的receiver是t,你可以在乙個 t型別的變數p上呼叫這個method,而不需要 p去呼叫這個method。i...

golang學習筆記

與c語法不同之處 1.引數列表中各個引數型別相同時可以只寫出最後乙個,如 add x,y int int 2.型別在引數名 變數 函式 後面 3.函式的左大括號要跟函式名同一行,否則編譯不過 4.函式定義要先寫關鍵字func在函式開頭 函式外的每個語句都要以func var等等關鍵字開頭 5.在包或...

Golang學習筆記

package main import fmt func main break default func inte ce select case defer gomap struct chan else goto package switch const fallthrough ifrange ty...