Golang中如何使用回调函数?
Golang中如何使用回调函数? 我需要无限次地使用 Go 线程。
3 回复
在 Go 语言中没有所谓的 “go 线程”,只有 “Go 协程”。
要终止单个协程,只需向其发送信号,如下所示:
package main
import (
"fmt"
"time"
)
func main() {
signal := make(chan struct{})
go func() {
fmt.Println("waiting")
<-signal
}()
// 等待 5 秒后发送信号
time.Sleep(time.Second * 5)
// 关闭操作将解除所有接收者的阻塞状态
fmt.Println("sending the signal")
close(signal)
}
在Go语言中,虽然没有传统意义上的“回调函数”概念,但可以通过goroutine和channel实现类似的功能,以满足无限次使用Go线程(goroutine)的需求。以下是一个示例,展示如何通过goroutine和channel来模拟回调机制,并无限次地执行任务。
示例代码:使用goroutine和channel实现回调式无限循环
package main
import (
"fmt"
"time"
)
// 定义一个回调函数类型
type Callback func(int)
// 无限次运行的goroutine,每次执行时调用回调函数
func infiniteWorker(callback Callback, stopChan chan bool) {
count := 0
for {
select {
case <-stopChan: // 检查停止信号
fmt.Println("Worker stopped.")
return
default:
count++
callback(count) // 调用回调函数,传递当前计数
time.Sleep(1 * time.Second) // 模拟工作间隔
}
}
}
// 示例回调函数:打印接收到的数据
func myCallback(data int) {
fmt.Printf("Callback received: %d\n", data)
}
func main() {
stopChan := make(chan bool) // 创建停止channel
// 启动无限goroutine
go infiniteWorker(myCallback, stopChan)
// 让主goroutine运行一段时间,然后发送停止信号
time.Sleep(5 * time.Second)
stopChan <- true // 发送停止信号
time.Sleep(1 * time.Second) // 等待goroutine退出
fmt.Println("Main function exiting.")
}
代码解释:
- 回调函数类型:
Callback类型定义了一个函数,接受一个整数参数,用于处理goroutine传递的数据。 - 无限goroutine:
infiniteWorker函数在一个无限循环中运行,每次迭代调用回调函数并递增计数。使用select语句监听停止channel,允许优雅终止。 - 停止机制:通过
stopChan发送信号来停止goroutine,避免资源泄漏。 - 主函数:启动goroutine后,主程序等待5秒,然后发送停止信号并退出。
运行结果示例:
Callback received: 1
Callback received: 2
Callback received: 3
Callback received: 4
Callback received: 5
Worker stopped.
Main function exiting.
这种方法允许goroutine无限次执行任务,同时通过回调函数处理结果。如果需要更复杂的控制,可以结合context或sync包来管理生命周期。

