跟着猫哥学Golang 16 - Channel



goroutine和channel是Golang之所以被称之为“天生并发”的两个核心原因。

 

channel是goroutine之间进行通信的一种方式。与Unix中的管道功能非常类似。

猫哥说:其实就是数据结构里面的队列嘛~ 先进先出~


channel声明:

ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType 


channel是类型相关的,换言之:一个channel只能传递一种类型。例如:

var ch chan int  #ch只能传递int。

举个栗子:

package main

import "fmt"

func justequal(a int, c chan int) {
	c <- a
}

func main() {
    c := make(chan int)
	go justequal(100,c)
	go justequal(200,c)
	// c <- 100 // 这样是肯定报错的!
	x, y:= <-c, <-c  // 从 c 中接收
	fmt.Println(x,y)
}

首先,定义一个channel,整型;

其次,用goroutine开个线程给channel塞进个内容;

然后,打印出来;(其实直接 fmt.Println( <-c, <-c)也是可以的,只是看起来总觉得哪里不对劲...)

最后,因为定义是 make(chan int),所以必须走goroutine方式给赋值。后面会说为什么。

================华丽丽的分割线===================

上面例子是最简单粗暴的channel——直肠子,存不住内容。实际上的channel,还是可以有“内涵”的。当然,IT行话,这个叫“缓冲”。

重新定义有“内涵”的channel:

ch := make(chan int, 10)

LOOK~ 内涵真的可以有,有10个捏~

这样一来,操作简单多了。再来个“栗子”:

package main

import "fmt"

func main() {
    c := make(chan int,10)
    c <- 100
    c <- 200
    c <- 300
    x,y,z := <-c, <-c, <-c
    fmt.Println(x,y,z)
}
结果:
100 200 300

是不是很清晰?先进先出。

定义channel时候,不写缓存大小,或者缓存数写成“0”,都表示无缓存。


有没有缓冲的区别,用个生活中收快递的情况对比一下。

快递到了~

1)快递员一直等你,你不来他不走(当然你不签收,他不能继续下一单),这个是没缓存的;

2)快递员不管你在不在,把快递包裹放在传达室,人就走了,忙下一单去了,这个是有缓存。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值