定义如下函数,从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))这样的
golang匿名函数中间件调用
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
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_func和dao_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) } }
如果你还有其他需求,比如支持多个中间件、链式调用等,也可以继续扩展这个结构。
评论 打赏 举报解决 1无用- 我们将