我最近学到,在
因此,如果有一个以接口
但是当我写自己的代码时,我在这个模式上有很多误解。我的代码像这样:
类型aaa具有方法eat,与接口规则相符的相同函数名称和参数签名,但为什么会出现错误? 接收器是否很重要?
另一个问题是仅使用函数和类型,不包括接口,代码如下:
首先,无论是否出错,
其次,在我去掉星号后,它可以正常工作,但是为什么?
似乎我的函数转换理解不正确,但我也查看了Google上的许多帖子,没有一个能教我如何正确地思考和使用它。谢谢!
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,与接口规则相符的相同函数名称和参数签名,但为什么会出现错误? 接收器是否很重要?
另一个问题是仅使用函数和类型,不包括接口,代码如下:
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
代表函数dog()吗?http包使用f(w,r)
的方式相同,但有点难理解。 op
是一种类型、实例还是匿名函数?似乎我的函数转换理解不正确,但我也查看了Google上的许多帖子,没有一个能教我如何正确地思考和使用它。谢谢!
T
时,*T
会被隐式声明为指向T
的指针,因此它确实存在。是的,区别主要在于您是否可以修改接收器。那么为什么Go不直接在接口中使用值的指针呢?这是因为(据我所知),当您将一个值传递给函数时,例如a := struct{42}; Foo(a)
,您应该能够放心地保证a
不会被更改。 - ANisus