为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中将函数转换为另一种类型(函数转换)

在 Go 中将函数转换为另一种类型(函数转换)

Go
HUWWW 2021-07-28 15:38:40
我最近了解到在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
提交
取消
意见反馈 帮助中心 APP下载
官方微信