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
}

通道路線(xiàn)實(shí)例

當(dāng)使用通道作為函數(shù)參數(shù)的時(shí)候,可以指定通道是否僅用于發(fā)送或者接收值。這種特殊性增加了程序的類(lèi)型安全性。

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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容