go语言中channel
时间: 2025-05-01 20:28:18 浏览: 22
### Go语言中Channel的使用教程
#### 创建通道
在Go语言里,`make()`函数用来创建通道。语法如下所示:
```go
ch := make(chan int)
```
这行代码创建了一个整型的无缓冲通道[^1]。
#### 发送和接收数据
向通道发送数据使用的符号是箭头`->`放在通道变量之后,而接收则是在通道前加上 `<-` 。下面是一个简单的例子来展示如何在一个goroutine中发送,在另一个goroutine中接收。
```go
func main() {
ch := make(chan string)
go func() { ch <- "hello" }()
msg := <-ch
fmt.Println(msg)
}
```
#### 关闭通道
当不再需要继续通过某个特定方向传送消息时可以关闭该通道。通常情况下由生产者负责关闭通道。一旦被关闭,则不能再往里面发消息,但是仍然可以从已有的未读取消息队列中获取信息直到全部取出为止。
```go
close(ch)
```
#### 缓冲通道
除了默认的无缓冲通道外,还可以指定大小初始化带缓冲区版本的通道。这样即使没有其他goroutines准备立即处理新传入的数据项也不会造成阻塞现象发生。
```go
bufferedCh := make(chan int, 3) // 定义长度为3的缓冲chan
```
#### 非阻塞操作
利用内置的选择语句 `select {}`, 可以实现非阻塞式的收发行为。如果没有任何case能够执行的话就会触发default分支下的逻辑部分。
```go
select {
case v := <-ch:
fmt.Printf("received %v\n", v)
default:
fmt.Println("no message received")
}
```
### 常见问题解答
有时可能会遇到尝试对nil类型的通道进行操作的情况,这是不允许的行为并会引发panic错误。因此务必记得总是要先调用`make()`完成实例化再做进一步的动作[^2]。
另外需要注意的是关于同步与异步的区别:对于不含有任何内部存储空间(即容量设为了零)的一类对象而言它们属于完全同步性质;而对于那些拥有一定数量槽位可供临时存放待交换的信息单元来说则是有条件性的——取决于当前剩余可用位置的数量多少决定着是否允许立刻提交或者提取请求而不必等待对方响应[^5]。
阅读全文
相关推荐



















