Go語言channel使用

字號+ 編輯: IT男在阿里 修訂: 种花家 來源: 利志分享 2023-09-11 我要說兩句(0)

Go語言的channel通信機制是該語種的一大亮點, 開創者對Go語言曾經陳述"不要通過共享内存來通信,而應該通過通信來共享内存"的先進技術理念,並加以實現。

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的四個特性

  1. 給一個 nil channel 發送數據,造成永遠阻塞.

  2. 從一個 nil channel 接收數據,造成永遠阻塞.

  3. 給一個已經關閉的 channel 發送數據,引起 panic.

  4. 從一個已經關閉的 channel 接收數據,立即返回一個零值

閲完此文,您的感想如何?
  • 有用

    0

  • 沒用

    0

  • 開心

    0

  • 憤怒

    0

  • 可憐

    0

1.如文章侵犯了您的版權,請發郵件通知本站,該文章將在24小時内刪除;
2.本站標注原創的文章,轉發時煩請注明來源;
3.交流群: 2702237 13835667

相關課文
  • GO語言GORM如何更新字段

  • gorm如何創建記錄與模型定義需要注意什麽

  • gorm一般查詢與高級查詢

  • GORM時間戳跟蹤及CURD(增刪改查)

我要說說
網上賓友點評