1. 程式人生 > >go語言通道channel使用總結

go語言通道channel使用總結

1.廣播

當一個通道關閉時, 所有此通道的讀取都會退出阻塞. 利用此特性可以實現廣播功能

package main

import (
    "fmt"
    "time"
)

func main() {
    c := make(chan bool)

    for i := 0; i < 5; i++ {
        go func(n int) {
            <-c //讀取到資料或通道關閉時會退出阻塞
            fmt.Println("收到通知:", n)
        }(i)

    }

    fmt.Println("廣播通知"
) close(c) //關閉通道, 廣播通知 time.Sleep(time.Second * 1) //等待其它協程處理 }

2.同時讀取多個通道

有時需要監視多個通道, 這個時候可以使用select

package main

import (
    "fmt"
    "time"
)

func main() {
    c1 := make(chan int)
    c2 := make(chan int)

    go func() {
        var n int
        select {
        case n = <-c1:
        case
n = <-c2: } fmt.Println("資料:", n) }() fmt.Println("寫入") c1 <- 1 //c2 <- 2 close(c1) close(c2) time.Sleep(time.Second * 1) //等待其它協程處理 }

3.超時

channel本身無法設定超時, 可以使用select和定時器實現超時功能

package main

import (
    "fmt"
    "time"
)

func main() {
    c := make
(chan int, 1) go func() { timeout := false var n int select { case n = <-c: case <-time.After(time.Second * 1): timeout = true } if timeout { fmt.Println("超時") } else { fmt.Println("讀取到資料:", n) } }() time.Sleep(time.Second * 2) c <- 2 time.Sleep(time.Second * 3) //等待其它協程處理 }

相關推薦

go語言通道channel使用總結

1.廣播 當一個通道關閉時, 所有此通道的讀取都會退出阻塞. 利用此特性可以實現廣播功能 package main import ( "fmt" "time" ) func main() { c := make(chan bo

go 通道go語言通道channel

通過使用通道,在多個goroutine傳送和接受共享的資料,達到資料同步的目的。 通道,他有點像在兩個routine之間架設的管道,一個goroutine可以往這個管道里塞資料,另外一個可以從這個管道里取資料,有點類似於我們說的佇列。 宣告一個通道很簡單,我

[日常] Go語言聖經--Channel習題

Go語言 inter fun ron goroutin close 創建 n) std 練習 8.3: 在netcat3例子中,conn雖然是一個interface類型的值,但是其底層真實類型是*net.TCPConn,代表一個TCP連接。一個TCP連接有讀和寫兩個部分,可

GO語言channel

前言: 初識go語言不到半年,我是一次偶然的機會認識了golang這門語言,看到他簡潔的語法風格和強大的語言特性,瞬間有了學習他的興趣。我是很看好go這樣的語言的,一方面因為他有谷歌主推,另一方面他確實有用武之地,高併發就是他的長處。現在的國內完全使用go開發的專案還不是很多,從這個上面

go語言常見問題總結

go語言中的goroutine和其它語言中的coroutine有什麼相同和不同? coroutine 意味著支援將控制轉移到另一個協程的明確手段。也就是說,程式設計師在確定coroutine何時應該暫停執行並將其控制權傳遞給另一個coroutine時(通過呼叫return/exi

go語言通道

注意:通道首先要通過make函式來初始化,初始化之後才可以執行寫入和讀取操作。此外還分為【有快取通道】和【無快取通道】,make函式第二個引數大於1,表示有快取;make函式的第二個引數的型別為整型,在使用make函式初始化通道時,快取必須大於1。不可以是0。 首先看一下通道在一個協程中

Go語言併發程式設計總結

Golang :不要通過共享記憶體來通訊,而應該通過通訊來共享記憶體。這句風靡在Go社群的話,說的就是 goroutine中的 channel ....... 他在go併發程式設計中充當著 型別安全的管道作用。 1、通過golang中的 goroutine 與sync

[Go語言] 操作channel時遇到panic怎麼辦?

很多同學在使用channel時都遇到過這種情況:Panic問題,相信大家對於這種設計也吐槽了不少吧?這篇文章我們就來扒一扒這樣設計的初衷。潛在的Panic主要有兩種: 重複close一個channel,

Go語言學習——channel的死鎖其實沒那麼複雜

1 為什麼會有通道   協程(goroutine)算是Go的一大新特性,也正是這個大殺器讓Go為很多路人駐足欣賞,讓信徒們為之歡呼津津樂道。   協程的使用也很簡單,在Go中使用關鍵字“go“後面跟上要執行的函式即表示新啟動一個協程中執行功能程式碼。 func main()

深度解密Go語言channel

目錄 併發模型 併發與並行 什麼是 CSP 什麼是 channel channel 實現 CSP 為什麼要 channel

Go語言基礎語法總結

# 1. 認識HelloWorld 在前面的[《Go的安裝和使用》](https://mp.weixin.qq.com/s/dMkXlVxg9LZ-Pn119ZnpDQ)這篇文章中已經寫過`HelloWorld.go`了,現在就來逐行認識一下它。 ```go package main import "f

Go 語言基礎—— 通道(channel)

通過通訊來共享記憶體(Java是通過共享記憶體來通訊的) 定義 func service() string { time.Sle

Go語言之數據類型總結

go語言 數據 數據類型字符串:字符串是不可變的字節序列,本身就是一個復合結構。頭部指針指向字節數組,但是沒有NULL結尾。默認以UTF-8編碼存儲Unicode字符,字面量裏允許使用十六進制、八進制和UTF-8編碼格式。內置函數len返回字節數組長度,cap不接受字符串類型參數。字符串默認是nil而不是&

Go語言【第十四篇】:Go語言基礎總結

cal pro 結果 第十四 深入 得到 divider math XP Go語言類型轉換 類型轉換用於將一種數據類型的變量轉換為另外一種類型的變量,Go語言類型轉換基本格式如下: type_name(expression) type_name為類型,expression為

Go語言高級特性總結——Struct、Map與JSON之間的轉化

err bsp make 特性 clas 高級 string comm tag Struct與Map之間互相轉換 1 // Struct2Map convert struct to map 2 func Struct2Map(st interface{}) map[s

go語言之行--golang核武器goroutine調度原理、channel詳解

-s 丟失 一半 內核調度 保留 dea 等等 ado 線程 一、goroutine簡介 goroutine是go語言中最為NB的設計,也是其魅力所在,goroutine的本質是協程,是實現並行計算的核心。goroutine使用方式非常的簡單,只需使用go關鍵字即可啟動一

go 語言學習十 - 通道

oat true out dia light n) pac func coo package main import ( "fmt" "math" ) /** c <- answers(chan) <- (cartesian str

GO語言使用之channel(管道)

一、為什麼需要channel 1、需求: 現在要計算 1-200 的各個數的階乘,並且把各個數的階乘放入到map中。最後顯示出來。要求使用goroutine完成 1)、分析思路: 使用goroutine 來完成,效率高,但是會出現併發/並行安全問題. 這裡就提出了不同go

Go語言8-goroutine和channel

Goroutine Go語言從語言層面上就支援了併發,這與其他語言大不一樣。Go語言中有個概念叫做goroutine,這類似我們熟知的執行緒,但是更輕。 程序、執行緒、協程 程序和執行緒程序是程式在作業系統中的一次執行過程,系統進行資源分配和排程的一個獨立單位。執行緒是程序的一個執行實體,是CPU排程和

Go語言程式設計基礎 併發(一)——Go程、通道

1 Go程 Go程(goroutine)是由Go執行時管理的輕量級執行緒。 # 啟動一個Go程並執行f(x, y, z) go f(x, y, z) note:f、x、y、z的求值在當前Go程中,而f的執行發生在新的Go程中。 Go程在相同的地址空間中執行,因此在訪問共享記憶體