我最近了解到在net/http包中,有一种使用模式让我最困惑。它是函数类型转换。它是这样的:(function a) ->convert to-> (type t)(type t) ->implentments-> (interface i)所以,如果有一个函数以接口i为参数,它会调用函数a,这就是net/http它的实现方式。但是当我编写自己的代码时,我对这种模式有很多误解。我的代码是这样的:package mainimport ( "fmt")type eat interface { eat()}type aaa func()func (op *aaa) eat() {//pointer receiver not right fmt.Println("dog eat feels good")}///////////////////////////////////////////////func dog() { fmt.Println("I'm a dog")}///////////////////////////////////////////////func feelsGood(a eat) { a.eat()}func main() { b := aaa(dog) feelsGood(b)}//error:aaa does not implement eat (eat method has pointer receiver)类型aaa有方法eat,函数名和参数签名一样,符合接口eat的规则,但是为什么会报错呢?接收器重要吗?另一个问题是只有一个函数和类型,不包括接口,代码是这样的:package mainimport ( "fmt")type aaa func()func (op *aaa) eat() { op()}///////////////////////////////////////////////func dog() { fmt.Println("I'm a dog")}///////////////////////////////////////////////func main() { obj:=aaa(dog) obj.eat()}//error:cannot call non-function op (type *aaa)第一,是op匿名函数,不管错误?其次,删除星号后效果很好,但为什么呢?op是类型的实例aaa,接收者是op,是否op代表函数狗()?http包的使用方式f(w,r)也是一样的,只是有点难懂。是op类型、实例还是匿名函数?看来我对函数转换的理解不太对,不过我也查了很多google的帖子,没有一个能教我如何思考和正确使用,谢谢!
2 回答
- 2 回答
- 0 关注
- 266 浏览
添加回答
举报
0/150
提交
取消