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