• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

go语言之进阶篇 channel介绍

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1、channel介绍

和map类似,channel也一个对应make创建的底层数据结构的引用。

 当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者何被调用者将引用同一个channel对象。和其它的引用类型一样,channel的零值也是nil。

 定义一个channel时,也需要定义发送到channel的值的类型。channel可以使用内置的make()函数来创建:

    make(chan Type) //等价于make(chan Type, 0)
    make(chan Type, capacity)

 当 capacity= 0 时,channel 是无缓冲阻塞读写的,当capacity> 0 时,channel 有缓冲、是非阻塞的,直到写满 capacity个元素才阻塞写入。

 channel通过操作符<-来接收和发送数据,发送和接收数据语法:

    channel <- value      //发送value到channel
    <-channel             //接收并将其丢弃
    x := <-channel        //从channel中接收数据,并赋值给x
    x, ok := <-channel    //功能同上,同时检查通道是否已关闭或者是否为空

默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得goroutine同步变的更加的简单,而不需要显式的lock。

示例:

package main

import (
	"fmt"
	"time"
)

//全局变量,创建一个channel
var ch = make(chan int)

//定义一个打印机,参数为字符串,按每个字符打印
//打印机属于公共资源
func Printer(str string) {
	for _, data := range str {
		fmt.Printf("%c", data)
		time.Sleep(time.Second)
	}
	fmt.Printf("\n")
}

//person1执行完后,才能到person2执行
func person1() {
	Printer("hello")
	ch <- 666 //给管道写数据,发送
}

func person2() {
	<-ch //从管道取数据,接收,如果通道没有数据他就会阻塞
	Printer("world")
}

func main() {
	//新建2个协程,代表2个人,2个人同时使用打印机
	go person1()
	go person2()

	//特地不让主协程结束,死循环
	for {

	}
}

执行结果:

hello
world

  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
微服务框架 Go-Micro 集成 Nacos 实战之服务注册与发现发布时间:2022-07-10
下一篇:
基于Go语言的日志系统----发布发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap