温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

golang并发编程之channel

发布时间:2020-07-10 13:24:32 来源:网络 阅读:969 作者:PowerMichael 栏目:编程语言
一、概念

channel是golang语言级别提供的协程(goroutine)之间的通信方式。
goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。那么goroutine之间如何进行数据的通信呢,Go提供了一个很好的通信机制channel。channel可以与Unix shell 中的双向管道做类比:可以通过它发送或者接收值。这些值只能是特定的类型:channel类型。定义一个channel时,也需要声明发送到channel的值的类型。

二、声明方式
    var chanName chan ElementType
    var ch chan int
    使用make,可以指定channel容量
    ch = make(chan int)
三、channel得读和写

channel通过操作符<-来接收和发送数据
默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得Goroutines同步变的更加的简单,而不需要显式的lock。所谓阻塞,也就是如果读取(value := <-ch)它将会被阻塞,直到有数据接收。其次,任何发送(ch<-5)将会被阻塞,直到数据被读出。无缓冲channel是在多个goroutine之间同步很棒的工具。

ch <- v    // 发送v的值到channel ch-> 写数据
v := <- ch // 从ch中接收数据,并赋值给v ->读数据
四、代码实现
package main

import (
    "fmt"
    "strconv"
)

//定义一个加法函数,传入channel类型,每计算一次,quit加1
func Add(x, y int, quit chan int)  {
    z := x + y
    fmt.Println(z)

    //写数据
    quit <- 1

}

//接受数据,并赋值给我
func Read(ch chan int)  {
    value := <- ch

    fmt.Println("value" + strconv.Itoa(value))

}

func Write(ch chan int)  {
    //ch <- 10

}

func main()  {

    //定义一个channel类型切片数组
    chs := make([]chan int, 10)

    //循环执行加法函数
    for i := 0; i < 10; i++ {
        //拿取一个channel
        chs[i] = make(chan int)
        //执行goroutine和发送一个channel类型数据
        go Add(i, i, chs[i])
    }

    for _, v := range chs {
        //接口channel类型数据
        <- v
    }
}
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI