通道實(shí)例
通道是連接并發(fā) goroutine 的管道叔扼」粝埽可以從一個(gè) goroutine 向通道發(fā)送值摆昧,并在另外一個(gè) goroutine 中接收到這些值顿苇。
使用 make(chan val-type) 創(chuàng)建一個(gè)新通道峭咒,通道由輸入的值傳入。使用通道 <- 語(yǔ)法將值發(fā)送到通道纪岁。這里從一個(gè)新的 goroutine 發(fā)送 “ping” 到上面的消息通道凑队。
<-channel 語(yǔ)法從通道接收值。在這里蜂科,將收到上面發(fā)送的 ping 消息并打印出來(lái)顽决。當(dāng)運(yùn)行程序時(shí) ping 消息通過(guò)通道成功地從一個(gè) goroutine 傳遞到另一個(gè) goroutine 。默認(rèn)情況下發(fā)送和接收塊导匣,直到發(fā)送方和接收方都準(zhǔn)備好才菠。此屬性允許在程序結(jié)束時(shí)等待 ping 消息,而不必要使用任何其他同步贡定。
示例代碼:
package main
import "fmt"
func main(){
//創(chuàng)建一個(gè)新的通道使用下面的方法
messages := make(chan string)
//發(fā)送一個(gè)值
go func(){message <- "ping"}()
//接收一個(gè)值
msg:= <-messages
fmt.Println(msg)
}
通道緩沖實(shí)例
默認(rèn)情況下赋访,通道是未緩沖的,意味著如果有相應(yīng)的接收 (<-chan)準(zhǔn)備好接收發(fā)送的值,它們將只接受發(fā)送 (chan<-)蚓耽。緩沖通道接受有限數(shù)量的值渠牲,而沒(méi)有用于這些值的相應(yīng)接收器。
這里使一個(gè)字符串的通道緩沖達(dá)到 2 個(gè)值步悠。因?yàn)檫@個(gè)通道被緩沖签杈,所以可以將這些值發(fā)送到通道中,而沒(méi)有相應(yīng)的并發(fā)接收鼎兽。
之后可以照常接收這兩個(gè)值答姥。
代碼示例如下:
package main
import "fmt"
func main(){
messages := make(chan string,2)
messages <- "buffered"
messages <- "channel"
fmt.Println(<-messages)
fmt.Println(<-messages)
}
通道同步實(shí)例
我們可以使用通道在 goroutine 上同步執(zhí)行程序。這里有一個(gè)使用阻塞接收等待 goroutine 完成示例谚咬。
這是將在 goroutine 中運(yùn)行的函數(shù)鹦付。 done 通道將用來(lái)通知另一個(gè) goroutine 這個(gè)函數(shù)的工作已經(jīng)完成,發(fā)送值以通知已經(jīng)完成择卦。
啟動(dòng)一個(gè) goroutine 工作程序敲长,給它一個(gè)通知通道。如果從此程序中刪除 <-done 行秉继,程序?qū)⒃诠ぷ鞒绦颍╳orker)啟動(dòng)之前退出祈噪。
阻止,知道在通道上收到工作程序的通知尚辑。
package main
import (
"fmt"
"time"
)
func worker(done chan bool){
fmt.Print("workding...")
time.Sleep(time.Second)
fmt.Println("done")
done <- true
}
func main(){
done := make (chan bool,1)
go worker(done)
<-done
}
通道路線實(shí)例
當(dāng)使用通道作為函數(shù)參數(shù)的時(shí)候钳降,可以指定通道是否僅用于發(fā)送或者接收值。這種特殊性增加了程序的類型安全性腌巾。
此 ping 功能直接收用于發(fā)送值的通道遂填,嘗試在此頻道上接收將是一個(gè)編譯時(shí)錯(cuò)誤。ping 函數(shù)接收一個(gè)通道接收 ping值澈蝙,一個(gè)接受發(fā)送 ping值吓坚。
package main
import "fmt"
//只接收通道發(fā)送數(shù)據(jù)
func ping(pings chan <- string,msg string){
pings<-msg
}
//只接收通道接收數(shù)據(jù)
//pong send
func pong(pings<-chan string,pongs chan<- string){
msg := <- pings
pongs <- msg
}
func main(){
pings := make(chan string,1)
pongs := make(chan string,1)
ping (pings,"passed message")
pong (pings,pongs)
fmt.Println(<-pongs)
}