【面试题】Golang 之 Channel(第二篇)

1.什么是Channel?

通道是Go中自带的、唯一一个可以满足并发安全性的类型。通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。

2.channel类型

var 变量 chan 元素类型

举几个例子: var ch1 chan int // 声明一个传递整型的通道 var ch2 chan bool // 声明一个传递布尔型的通道 var ch3 chan []int // 声明一个传递int切片的通道

声明的通道需要使用make函数初始化后才能使用 make(chan 元素类型, [缓冲大小]) // channel的缓冲大小是可选的。

举几个例子: ch4 := make(chan int) ch5 := make(chan bool) ch6 := make(chan []int)

通道有发送(send)、接收(receive)和关闭(close)三种操作。发送和接收都使用<-符号。

 定义一个通道
 ch := make(chan int) 
​
将一个值发送到通道中。
 ch <- 10 // 把10发送到ch中
​
从一个通道中接收值。
x := <- ch // 从ch中接收值并赋值给变量x
<-ch       // 从ch中接收值,忽略结果

我们通过调用内置的close函数来关闭通道。 close(ch)

关于关闭通道需要注意的事情是,只有在通知接收方goroutine所有的数据都发送完毕的时候才需要关闭通道。通道是可以被垃圾回收机制回收的,它和关闭文件是不一样的,在结束操作之后关闭文件是必须要做的,但关闭通道不是必须的。

关闭后的通道有以下特点:

对一个关闭的通道再发送值就会导致panic。 对一个关闭的通道进行接收会一直获取值直到通道为空。 对一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值。 关闭一个已经关闭的通道会导致panic。

代码示例:

package main
​
import "fmt"
​
func main() {
  // 声明并初始化了一个元素类型为int、容量为3的通道ch1
  ch1 := make(chan int, 3)
​
  // 向该通道先后发送了三个元素值2、1和3
  ch1 <- 2
  ch1 <- 1
  ch1 <- 3
​
  // 语句elem1 := <-ch1会将最先进入ch1的元素2接收来并存入变量elem1
  elem1 := <-ch1
  fmt.Printf("The first element received from channel ch1: %v\n",elem1)
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值