package main
import (
"fmt"
"time"
)
var c chan int
func ready(w string, sec int) {
time.Sleep(time.Duration(sec) * time.Second)
fmt.Println(w, "is ready")
//往channel中插入數據
c <- 1
}
//有緩沖的channel:這裡有個緩沖,因此放入數據的操作c<- 0先於取數據操作 <-c
var a string
var c1 = make(chan int, 10)
func f() {
a = "hello world"
c1 <- 0
}
//無緩沖的channel:由於c是無緩沖的channel,因此必須保证取操作<-c 先於放操作c<- 0
var a2 string
var c2 = make(chan int)
func f2() {
a2 = "hellow my world"
<-c2
}Go語言提供的消息通信機制被稱爲channel
"不要通過共享内存來通信,而應該通過通信來共享内存。"
channel是Go語言在語言級別提供的goroutine間的通信方式。
channel是類型相關的chan聲明,var chanName chan ElementType 並使用直接使用内置的函數make()創建即可:
ch := make(chan int)
func main() {
c = make(chan int)
go ready("Tee", 2)
go ready("Coffee", 1)
fmt.Println("i am waiting,but not too long")
//從channel中輸出數據
<-c
<-c
go f()
<-c1
fmt.Println(a)
go f2()
c2 <- 0
fmt.Println(a2)
}channel分爲兩種:一種是有buffer的,一種是沒有buffer的,默認是沒有buffer的
ci := make(chan int) //無buffer cj := make(chan int, 0) //無buffer cs := make(chan int, 100) //有buffer
有緩沖的channel,因此要注意“放”先於“取”
無緩沖的channel,因此要注意“取”先於“放”
關於channel的四個特性
給一個 nil channel 發送數據,造成永遠阻塞.
從一個 nil channel 接收數據,造成永遠阻塞.
給一個已經關閉的 channel 發送數據,引起 panic.
從一個已經關閉的 channel 接收數據,立即返回一個零值