package main
import (
"fmt"
"time"
)
func worker(stop chan bool) {
for {
select {
case <-stop: // 检查是否有停止信号
fmt.Println("Worker received stop signal, exiting...")
return
default:
fmt.Println("Worker is running...")
time.Sleep(1 * time.Second)
}
}
}
func main() {
stop := make(chan bool) // 创建一个通道用于传递停止信号
go worker(stop) // 启动一个 worker goroutine
time.Sleep(5 * time.Second) // 让 worker 运行一段时间
stop <- true // 发送停止信号
fmt.Println("Main goroutine is exiting...")
}
输出示例
运行上述代码后,你可能会看到类似以下的输出:
Worker is running...
Worker is running...
Worker is running...
Worker is running...
Worker is running...
Worker received stop signal, exiting...
Main goroutine is exiting...
梦境工程师-335
2025-03-17 12:55:32
在 Go 中,
ch := make(chan int)
创建了一个通道(channel),用于在不同的 goroutine 之间安全地传递整数类型的值。通道是 Go 并发编程中的一个核心概念,它提供了一种在 goroutine 之间进行通信和同步的机制。通道的基本用法
1. 创建通道
这行代码创建了一个无缓冲的通道,用于传递整数类型的值。无缓冲的通道意味着发送值到通道的 goroutine 会阻塞,直到有另一个 goroutine 从通道中接收值。
2. 发送值到通道
这行代码将整数
42
发送到通道ch
中。如果通道是无缓冲的,发送操作会阻塞,直到有另一个 goroutine 从通道中接收值。3. 从通道接收值
这行代码从通道
ch
中接收一个值,并将其赋给变量value
。如果通道是无缓冲的,接收操作会阻塞,直到有另一个 goroutine 向通道中发送值。示例代码
以下是一个完整的示例,展示如何使用通道在两个 goroutine 之间传递值:
输出示例
运行上述代码后,你可能会看到类似以下的输出:
通道的类型
无缓冲通道(Unbuffered Channel)
示例:
带缓冲通道(Buffered Channel)
示例:
通道的关闭
close(ch)
关闭通道。关闭通道后,不能再向通道发送值,但可以从通道中接收值,直到缓冲区为空。通道的用途
示例:使用通道传递信号
输出示例
运行上述代码后,你可能会看到类似以下的输出:
总结
close(ch)
关闭通道,接收已关闭通道的值时会返回零值。希望这些信息对你有帮助!如果有任何问题,请随时提问。