我最近了解到在net/http包中,有一种使用模式让我最困惑。它是函数类型转换。它是这样的:
(function a) ->convert to-> (type t)
(type t) ->implentments-> (interface i)
所以,如果有一个函数以接口i为参数,它会调用函数a,这就是net/http它的实现方式。
但是当我编写自己的代码时,我对这种模式有很多误解。我的代码是这样的:
package main
import (
"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 main
import (
"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的帖子,没有一个能教我如何思考和正确使用,谢谢!
相关分类