代码如下:
package main
import (
"fmt"
)
type Task struct {
f func(i interface{})
}
func NewTask(h func(interface{})) (t *Task) {
t = &Task{
f: h,
}
return
}
func (t *Task) Run() {
fmt.Println("Runing...")
}
func test1(i *int) error {
fmt.Println("test1", i)
// do something here
// ...
return nil
}
func test2(s *string) (err error) {
fmt.Println("test2", s)
// do otherthing here
// ...
return
}
func main() {
t1 := NewTask(test1)
t2 := NewTask(test2)
t1.Run()
t2.Run()
}
报错: .\main.go:33:15: cannot use test1 (type func(int) error) as type func(interface {}) in argument to NewTask .\main.go:34:15: cannot use test2 (type func(string) error) as type func(interface {}) in argument to NewTask
请教诸位如何修改?谢谢
有疑问加站长微信联系(非本文作者)

亲,请使用markdown格式化你的代码. 否则看不懂而且缺东西?
是不是就是想简单实现这个??
@daiyudong 谢谢回复 我是想把处理函数传进去,每个Task有不同的处理函数。
函数返回类型也是函数类型的一部分,func (*int) error 和 func (interface{}) error 这俩没法直接转换
1.你对interface{}有误解
2.你这个场景需要的不是传入函数,而是建立一个task 的 interface,然后把这个interface传进去
伪代码
感觉你是想要多态。 https://www.jianshu.com/p/b333c5f34ef6 参考一下。
golang是不支持泛型的, 所以你设计的参数传递不能实现, 你只能做成这样:
或者你可以使用context.Context来传递任何你想传递的参数
存在两个问题 1、test1和test2有返回值,task中f没有 2、func(i interface{})和test1(i *int)是不同的函数,也可以理解为两种不同的类型