我最近了解到在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 回答
- 0 關注
- 291 瀏覽
添加回答
舉報
0/150
提交
取消