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!"))
}

主函数中回调函数具体通过匿名函数实现。

相关推荐
JenKinJia15 分钟前
Windows10配置C++版本的Kafka,并进行发布和订阅测试
开发语言·c++
煤炭里de黑猫17 分钟前
Lua C API :lua_insert 函数详解
开发语言·lua
笨鸟笃行19 分钟前
爬虫第七篇数据爬取及解析
开发语言·爬虫·python
编程乐趣20 分钟前
一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略来了!
开发语言·c#
java1234_小锋25 分钟前
一周学会Flask3 Python Web开发-response响应格式
开发语言·python·flask·flask3
Jelena1577958579225 分钟前
使用Java爬虫获取1688 item_get_company 接口的公司档案信息
java·开发语言·爬虫
java1234_小锋27 分钟前
一周学会Flask3 Python Web开发-flask3模块化blueprint配置
开发语言·python·flask·flask3
坚定信念,勇往无前1 小时前
springboot单机支持1w并发,需要做哪些优化
java·spring boot·后端
我是苏苏1 小时前
C#基础:使用Linq进行简单去重处理(DinstinctBy/反射)
开发语言·c#·linq
小小码农(找工作版)1 小时前
C#前端开发面试题
开发语言·c#