调用函数
当我用struct Lock
定义struct Lock
和函数 Test
作为函数接收器时
type Lock struct {
}
func (self Lock) Test() {
fmt.Println("Test Func")
}
我发现我可以使用 Lock
struct指针调用此函数
lock := &Lock{}
lock.Test()
同样,如果我将struct Lock
和函数 Test
定义为 Lock
的指针作为接收器,我可以通过 Lock
struct实例调用此函数 .
所以无论接收器是结构本身还是结构指针,我都可以通过两者调用这个函数?什么原因 . 根据我的理解,struct和struct指针完全是两种不同的类型!
界面
如果像这样定义一个接口 Locker
type Locker interface {
Test()
}
并使用struct instance 作为接收器定义struct Lock
和函数 Test
,我无法将结构指针变量分配给 Locker
接口var .
相反,如果使用struct pointer 作为接收器定义struct Lock
和函数 Test
,则将结构实例变量分配给 Locker
接口var可以正常工作!
我对语言设计很困惑 . 有人可以给我一些建议吗?
1 回答
通常,Golang会为您做一些事情,这通常是其中一种情况 .
当你用一个struct作为接收器定义一个函数并向它传递一个指向struct的指针时,Golang会为你做转换:它传递一个指向的struct的副本 .
当您使用指针作为接收器定义函数并将结构传递给它时,Golang会创建一个指向此结构的指针 .
但是,在定义接口时,您正在处理类型:
Locker
接口定义了一个实现函数Test()
的类型 .使用接口,Golang将无法帮助您:如果您的类型没有实现方法,那么它不会实现接口 . 这里没有隐藏的转换 .
通常情况下,最好清楚自己想要什么,想要什么,从而阻止Go进行那些奇怪的转换 .