Go 語(yǔ)言編程實(shí)例(一)

通道實(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)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灯荧,隨后出現(xiàn)的幾起案子礁击,更是在濱河造成了極大的恐慌,老刑警劉巖逗载,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哆窿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡厉斟,警方通過(guò)查閱死者的電腦和手機(jī)挚躯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)擦秽,“玉大人码荔,你說(shuō)我怎么就攤上這事漩勤。” “怎么了缩搅?”我有些...
    開(kāi)封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵越败,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我硼瓣,道長(zhǎng)究飞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任堂鲤,我火速辦了婚禮噪猾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筑累。我一直安慰自己,他們只是感情好丝蹭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布慢宗。 她就那樣靜靜地躺著,像睡著了一般奔穿。 火紅的嫁衣襯著肌膚如雪镜沽。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天贱田,我揣著相機(jī)與錄音缅茉,去河邊找鬼。 笑死男摧,一個(gè)胖子當(dāng)著我的面吹牛蔬墩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耗拓,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拇颅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了乔询?” 一聲冷哼從身側(cè)響起樟插,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竿刁,沒(méi)想到半個(gè)月后黄锤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡食拜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年鸵熟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片负甸。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旅赢,死狀恐怖齿桃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煮盼,我是刑警寧澤短纵,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站僵控,受9級(jí)特大地震影響香到,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜报破,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一悠就、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧充易,春花似錦梗脾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至稿静,卻和暖如春梭冠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背改备。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工控漠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悬钳。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓盐捷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親默勾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子毙驯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)灾测,斷路器爆价,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • Go的內(nèi)存模型 看完這篇文章你會(huì)明白 一個(gè)Go程序在啟動(dòng)時(shí)的執(zhí)行順序 并發(fā)的執(zhí)行順序 并發(fā)環(huán)境下如何保證數(shù)據(jù)的同步...
    初級(jí)賽亞人閱讀 2,855評(píng)論 0 2
  • 第一章五個(gè)程序 都很好!但是初學(xué)編程/沒(méi)有其他語(yǔ)言基礎(chǔ)的不容易看懂媳搪。 記一遍不熟悉的東西: who = strin...
    暗黑破壞球嘿哈閱讀 1,431評(píng)論 0 10
  • 作者:梨花梧桐 聲明:以下指示個(gè)人愚見(jiàn)而已铭段,未必正確 如今,看書閱讀的人多了秦爆,同時(shí)越來(lái)越多的人進(jìn)行文學(xué)創(chuàng)作序愚,你有沒(méi)...
    梨花梧桐閱讀 169評(píng)論 0 1
  • 時(shí)間動(dòng)了情 像你的頭發(fā)溫柔又漫長(zhǎng) 我問(wèn)服務(wù)員 發(fā)酸的檸檬水為何也要收費(fèi) 明明酸的讓人流眼淚 我問(wèn)老板 重復(fù)的工作為...
    柳客風(fēng)閱讀 377評(píng)論 0 0