Golang中如何使用回调函数?

Golang中如何使用回调函数? 我需要无限次地使用 Go 线程。

3 回复

我不太确定您想要实现什么。您能说得更具体些吗?

更多关于Golang中如何使用回调函数?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在 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传递的数据。
  • 无限goroutineinfiniteWorker 函数在一个无限循环中运行,每次迭代调用回调函数并递增计数。使用 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包来管理生命周期。

回到顶部