go语言回调函数的使用
前言
在 Go 语言中,回调函数是一种将一个函数作为参数传递给另一个函数,在特定的事件发生时被调用的编程模式。
一、回调函数的定义
type OnTaskHandler func(r []byte)
type remoteTaskClient struct {
sync.RWMutex
onTask OnTaskHandler
}
以上定义了一个用于处理任务的结构体,可以通过设置回调函数的方式来灵活地处理不同的情况,同时使用读写锁来保证在并发环境下的安全性。
二、定义结构体方法
func (c *remoteTaskClient) SetOnTaskHandler(onTask OnTaskHandler) {
c.Lock()
defer c.Unlock()
c.onTask = onTask
}
func (c *remoteTaskClient) ProcessMessage(message []byte) {
if c.onTask != nil {
c.onTask(message) // 调用回调函数处理消息
}
}
定义了两个方法一个是与回调函数绑定的方法,另一个是任务参数接收的方法。
三、主函数调用
func main() {
client := &remoteTaskClient{}
// 模拟接收消息,此时没有回调函数被设置
client.ProcessMessage([]byte("Hello, world!"))
// 设置回调函数
client.SetOnTaskHandler(func(data []byte) {
fmt.Println("Received message:", string(data))
})
// 模拟接收消息,此时回调函数已被设置
client.ProcessMessage([]byte("Hello again, world!"))
}
主函数中SetonTaskHandler方法的参数中包含了回调函数的具体实现,当接收到任务信息就会执行。
四、测试函数
package main
import (
"fmt"
)
type OnTaskHandler func(r []byte)
type remoteTaskClient struct {
sync.RWMutex
onTask OnTaskHandler
}
func (c *remoteTaskClient) SetOnTaskHandler(onTask OnTaskHandler) {
c.Lock()
defer c.Unlock()
c.onTask = onTask
}
func (c *remoteTaskClient) ProcessMessage(message []byte) {
if c.onTask != nil {
c.onTask(message) // 调用回调函数处理消息
}
}
func main() {
client := &remoteTaskClient{}
// 模拟接收消息,此时没有回调函数被设置
client.ProcessMessage([]byte("Hello, world!"))
// 设置回调函数
client.SetOnTaskHandler(func(data []byte) {
fmt.Println("Received message:", string(data))
})
// 再次模拟接收消息,此时回调函数已被设置
client.ProcessMessage([]byte("Hello again, world!"))
}