无缓冲channel实现同步通信,发送与接收需同时就绪;2. 带缓冲channel可异步传递数据,允许预先存入指定数量值;3. channel关闭后可通过逗号-ok模式判断是否读取完毕,结合for-range遍历更安全。

在Go语言中,channel 是用于在多个goroutine之间安全传递数据的重要机制。它不仅实现了通信,还隐含了同步控制,避免了传统锁的复杂性。下面通过几个简单示例展示如何使用channel进行数据传递。
1. 基本的channel数据传递
创建一个无缓冲channel,一个goroutine发送数据,主goroutine接收数据:
func main() {
ch := make(chan string)
go func() {
ch <- "hello from goroutine"
}()
msg := <-ch
fmt.Println(msg)}
这个例子中,发送和接收操作是同步的,只有当两边都准备好时通信才会发生。
立即学习“go语言免费学习笔记(深入)”;
2. 使用带缓冲channel异步传递
带缓冲的channel允许一定数量的数据在不阻塞的情况下发送:
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
fmt.Println(<-ch)
fmt.Println(<-ch)
}
缓冲大小为2,可以在没有接收者时先放入两个值,适合解耦生产与消费速度。
这是一个在线展示企业网站范例的源代码,涉及36个行业分类近500个精美企业网站程序范例——不论是对美工还是程序员,都有相当高的参考价值! 使用 后台管理:登录用户为“admin”,登录密码为“admin888”,登录页面为“Manage.asp”。 包含“管理员管理/添加网站/管理网站/数据库和上传文件管理”的完整功能。 其他 请把数据库后缀名MDB改为ASP防下载,同时修改两个Conn.asp
3. 关闭channel并遍历数据
当不再有数据发送时,可以关闭channel,接收方可通过第二个返回值判断是否已关闭:
func main() {
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch)
for num := range ch {
fmt.Println(num)
}}
使用 range 遍历channel会自动检测关闭状态,避免死锁或读取零值。
4. 多个goroutine协作传递数据
常见模式:一个生产者,一个消费者:
func producer(ch chan<- int) {
for i := 0; i < 5; i++ {
ch <- i * i
}
close(ch)
}
func consumer(ch <-chan int) {
for val := range ch {
fmt.Println("received:", val)
}
}
func main() {
ch := make(chan int)
go producer(ch)
consumer(ch)
}
这里使用了单向channel类型:chan 表示只发送, 表示只接收,增强代码可读性和安全性。
基本上就这些。channel是Golang并发编程的核心,合理使用能写出简洁、高效的并发程序。注意不要往已关闭的channel发送数据,会导致panic。接收方应始终考虑channel关闭的情况。









