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.交流群: PHP+JS聊天群

相关课文
  • GO语言GORM如何更新字段

  • gorm如何创建记录与模型定义需要注意什么

  • gorm一般查询与高级查询

  • GORM时间戳跟踪及CURD(增删改查)

我要说说
网上宾友点评