channel直譯過來就是管道,chan關鍵字定義了goroutine中的管道通訊,乙個goroutine可以和另乙個goroutine進行通訊。
chan的讀寫和定義如下:
//define a chan type variable
var ch chan int = make(chan int, 10);
//or
ch := make(chan int, 10);
//write data into chan
ch ch
//read data from chan
var x int;
x =
x =
看下面這段**,其中x獲取ch隊頭值,nonempty返回ch是否非空的:
func main()
列印結果:
可以看到chan是類似佇列的先進先出型別,每次讀出乙個資料後,ch自動彈出該資料不再儲存。
chan一定要初始化才能進行讀寫操作,否則產生死鎖:
package main
import (
"fmt"
)func main()
執行結果,由於所有goroutine已經睡眠,產生死鎖:
select會執行第乙個可以執行的case語句,會一直監聽直到有第乙個可以執行的語句。或者換一種說法,select就是用來監聽和channel有關的io操作,當 io 操作發生時,觸發相應的動作。
看這段**:
package main
import (
"fmt"
"time"
)func main() ()
select
time.sleep(time.second)
}
執行結果,寫入0:
注釋掉第乙個case:
select
執行結果,由於ch為空無法讀出,執行default:
如果有多個io操作都可以執行的話,select會隨機選擇乙個執行:
select
兩種結果:
this關鍵字理解
public class test implements runnable synchronized void m1 throws interruptedexception synchronized void m2 throws interruptedexception override publi...
java中this關鍵字的理解
this關鍵字 1 呼叫本類中的屬性 成員變數 2 呼叫本類中的方法 3 呼叫本類中的其他構造方法,呼叫時要放在構造方法的首行。例 public class person private string name private string phone public void setname str...
C virtual關鍵字理解
在c 語言中,從 到程式的執行,要經歷編譯和連線,針對這兩個不同的階段,c 設計了不同的機制,其中vitual和inline就是區分編譯器工作和鏈結器工作的標誌 inline很容易理解,生命為inline的函式在編譯階段即被展開成 而非inline的函式採用執行時鏈結的方式處理 vitual關鍵字,...