调用功能
当我定义一个struct Lock和一个函数Test时,使用struct Lock作为函数接收器。
type Lock struct {
}
func (self Lock) Test() {
fmt.Println("Test Func")
}我发现我可以用Lock结构指针调用这个函数。
lock := &Lock{}
lock.Test()同样,如果我将一个struct Lock和一个函数Test定义为Lock的指针作为接收者,我可以通过Lock struct实例调用这个函数。
因此,无论接收者是结构本身还是结构指针,我都可以通过两者调用这个函数?原因是什么。据我理解,结构和结构指针完全是两种不同的类型!
接口
如果像这样定义接口Locker
type Locker interface {
Test()
}并定义一个struct Lock和函数Test,并以struct 实例作为接收方,我不能将struct指针变量分配给Locker接口var。
相反,如果定义一个struct Lock和一个函数Test,并以struct 指针作为接收者,那么将一个struct实例变量赋给Locker接口var可以工作!
我对语言设计很困惑。有人能给我一些建议吗?
发布于 2016-10-18 15:51:10
通常,在引擎盖下为您做一些事情,这是典型的情况之一。
当您定义一个以struct作为接收方的函数,并向它传递指向该结构的指针时,然后进行转换:它传递指向的结构的副本。
当您用指针定义函数作为接收器,并将其传递给结构时,Go将创建指向此结构的指针。
但是,在定义接口时,您正在处理类型:Locker接口定义了实现函数Test()的类型。
对于接口,Go对您没有帮助:如果您的类型没有实现一个方法,那么它就不会实现这个接口。这里没有隐藏的皈依。
通常,最好弄清楚你想要什么和你想要什么,从而防止你去做那些奇怪的转换。
https://stackoverflow.com/questions/40112250
复制相似问题