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

我最近了解到在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的帖子,没有一个能教我如何思考和正确使用,谢谢!


HUWWW
浏览 267回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go