首页 文章

Golang Pointer和Struct成员函数

提问于
浏览
-2

调用函数

当我用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 回答

  • 0

    通常,Golang会为您做一些事情,这通常是其中一种情况 .

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

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

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

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

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

相关问题