Golang Pointer和Struct成员函数

时间:2016-10-18 15:27:53

标签: go

调用函数

当我使用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可以工作!

我对语言设计很困惑。有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

通常,Golang会为你做一些事情,这通常就是其中之一。

当你定义一个带有struct作为接收器的函数并且你传递一个指向struct的指针时,Golang会为你做转换:它传递指向的struct的副本。

当您使用指针作为接收器定义函数并将结构传递给它时,Golang会创建一个指向此结构的指针。

但是,在定义接口时,您正在处理类型:Locker接口定义了一个实现函数Test()的类型。

使用接口,Golang不会帮助您:如果您的类型没有实现方法,那么它不会实现接口。这里没有隐藏的转换。

通常情况下,最好清楚自己想要什么,想要什么,从而阻止Go进行那些奇怪的转换。