代码如下:
```go
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
请教诸位如何修改?谢谢
存在两个问题
1、test1和test2有返回值,task中f没有
2、func(i interface{})和test1(i *int)是不同的函数,也可以理解为两种不同的类型
```go
package main
import (
"errors"
"fmt"
)
type Task struct {
f func(i interface{}) error
}
func NewTask(h func(interface{}) error) (t *Task) {
t = &Task{
f: h,
}
return
}
func (t *Task) Run() {
fmt.Println("Runing...")
}
func test1(i interface{}) error {
// 类型断言一下
intI,isOk := i.(int)
if ! isOk {
return errors.New("type is invalid")
}
fmt.Println("test1", intI)
// do something here
// ...
return nil
}
func test2(s interface{}) (err error) {
// 类型断言一下
str,isOk := s.(int)
if ! isOk {
return errors.New("type is invalid")
}
fmt.Println("test2", str)
// do otherthing here
// ...
return
}
func main() {
t1 := NewTask(test1)
t2 := NewTask(test2)
t1.Run()
t2.Run()
}
```
#9
更多评论
```go
package main
import "fmt"
type task struct {
f func(i interface{})
}
func (t *task) run() *task {
return &task{
f: func(i interface{}) {
fmt.Println(i)
},
}
}
func allType() *task {
return &task{
f: func(i interface{}) {
fmt.Println(i)
},
}
}
func main() {
a := allType()
a.f("aaa")
var b task
b1 := b.run()
b1.f("bbb")
}
```
是不是就是想简单实现这个??
#2