showliuzp 2025-10-09 22:07 采纳率: 84.3%
浏览 4
已结题

golang匿名函数中间件调用


定义如下函数,从dao调用方法
type dao_funs func(streamer_id,start_unixtime,end_unixtime int64)(interface{},error)

func middle_func(funs dao_funs,start_unixtime, end_unixtime int64) func(int64)(interface{},error){
    return func(streamer_id int64)(interface{},error){
        detail,err := funs(streamer_id,start_unixtime,end_unixtime)
        return detail,err
    }
}


//调用
func wrapStreamerDayGroup(streamer_id, start_unixtime, end_unixtime int64) (interface{}, error) {
        return dao.StreamerDayGroup(streamer_id, start_unixtime, end_unixtime)
}
//主播收入统计
func streamer_report_day_detail(start_unixtime,end_unixtime int64) func(int64)(interface{}, error) {
    return middle_func(wrapStreamerDayGroup,start_unixtime,end_unixtime)
}

在streamer_report_day_detail里调用wrapStreamerDayGroup是可以的,我想把wrapStreamerDayGroup不定义一个函数,而是类似中间件的调用,比如middle_func(wrapStreamerDayGroup(streamer_id, start_unixtime, end_unixtime int64))这样的
  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2025-10-09 22:08
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你希望在 streamer_report_day_detail不定义 wrapStreamerDayGroup 这个函数,而是直接使用一个匿名函数来实现中间件逻辑。你提到的写法是:

    middle_func(wrapStreamerDayGroup(streamer_id, start_unixtime, end_unixtime int64))
    

    但这个写法是错误的,因为 wrapStreamerDayGroup 是一个函数,不是可以直接调用的值。你不能在 middle_func 的参数中直接调用它。


    ✅ 正确方式:使用匿名函数作为中间件

    为了实现你的目标,我们可以将 wrapStreamerDayGroup 替换为一个匿名函数,并将其作为 middle_func 的参数传入。这样就不需要单独定义 wrapStreamerDayGroup 函数了。


    1. 修改 streamer_report_day_detail 函数

    我们将 wrapStreamerDayGroup 替换为一个匿名函数,并直接传递给 middle_func

    func streamer_report_day_detail(start_unixtime, end_unixtime int64) func(int64)(interface{}, error) {
        // 使用匿名函数替代 wrapStreamerDayGroup
        return middle_func(func(streamer_id int64, start, end int64) (interface{}, error) {
            return dao.StreamerDayGroup(streamer_id, start, end)
        }, start_unixtime, end_unixtime)
    }
    

    重点说明:

    • 我们将 wrapStreamerDayGroup 替换为一个匿名函数,其签名与 dao_funs 一致。
    • middle_func 接收这个匿名函数作为参数,并返回一个闭包。

    2. 确保 middle_funcdao_funs 类型定义正确

    type dao_funs func(streamer_id, start_unixtime, end_unixtime int64) (interface{}, error)
    
    func middle_func(funs dao_funs, start_unixtime, end_unixtime int64) func(int64)(interface{}, error) {
        return func(streamer_id int64) (interface{}, error) {
            detail, err := funs(streamer_id, start_unixtime, end_unixtime)
            return detail, err
        }
    }
    

    注意:

    • middle_func 接受一个 dao_funs 类型的函数 funs,并在内部创建一个新的函数(闭包),该函数接受 streamer_id 并调用 funs

    3. 调用示例

    func main() {
        start := int64(1609459200) // 2021-01-01
        end := int64(1612142400)   // 2021-01-31
    
        handler := streamer_report_day_detail(start, end)
    
        result, err := handler(12345)
        if err != nil {
            fmt.Println("Error:", err)
        } else {
            fmt.Println("Result:", result)
        }
    }
    

    ✅ 总结

    | 步骤 | 操作 | |------|------| | 1 | 将 wrapStreamerDayGroup 替换为一个匿名函数,避免单独定义 | | 2 | 在 streamer_report_day_detail 中直接调用 middle_func 并传入匿名函数 | | 3 | 确保类型匹配:middle_func 接收 dao_funs 类型的函数 |


    ✅ 最终代码如下

    package main
    
    import "fmt"
    
    // 定义函数类型
    type dao_funs func(streamer_id, start_unixtime, end_unixtime int64) (interface{}, error)
    
    // 中间件函数
    func middle_func(funs dao_funs, start_unixtime, end_unixtime int64) func(int64)(interface{}, error) {
        return func(streamer_id int64) (interface{}, error) {
            detail, err := funs(streamer_id, start_unixtime, end_unixtime)
            return detail, err
        }
    }
    
    // 示例 DAO 方法
    var dao = struct {
        StreamerDayGroup func(streamer_id, start, end int64) (interface{}, error)
    }{
        StreamerDayGroup: func(streamer_id, start, end int64) (interface{}, error) {
            return fmt.Sprintf("Data for streamer %d from %d to %d", streamer_id, start, end), nil
        },
    }
    
    // 修改后的 streamer_report_day_detail
    func streamer_report_day_detail(start_unixtime, end_unixtime int64) func(int64)(interface{}, error) {
        return middle_func(func(streamer_id, start, end int64) (interface{}, error) {
            return dao.StreamerDayGroup(streamer_id, start, end)
        }, start_unixtime, end_unixtime)
    }
    
    func main() {
        start := int64(1609459200) // 2021-01-01
        end := int64(1612142400)   // 2021-01-31
    
        handler := streamer_report_day_detail(start, end)
    
        result, err := handler(12345)
        if err != nil {
            fmt.Println("Error:", err)
        } else {
            fmt.Println("Result:", result)
        }
    }
    

    如果你还有其他需求,比如支持多个中间件、链式调用等,也可以继续扩展这个结构。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月9日
  • 创建了问题 10月9日