gpt4 book ai didi

go - 指针和结构成员函数

转载 作者:数据小太阳 更新时间:2023-10-29 03:37:29 29 4
gpt4 key购买 nike

调用函数

当我定义一个结构 Lock 和一个函数 Test 时,结构 Lock 作为函数接收者

type Lock struct {
}

func (self Lock) Test() {
fmt.Println("Test Func")
}

我发现我可以用一个Lock结构指针来调用这个函数

lock := &Lock{}
lock.Test()

同理,如果我定义一个struct Lock和一个函数Test作为Lock的指针作为接收者,我可以调用此函数通过 Lock 结构实例。

那么无论接收者是结构本身还是结构指针,我都可以通过两者调用这个函数吗?什么原因。据我理解,struct和struct pointer是完全不同的两种类型!

界面

如果像这样定义一个接口(interface) Locker

type Locker interface {
Test()
}

并定义一个结构Lock 和一个函数Test 以结构instance 作为接收者,我不能分配结构指针变量到 Locker 接口(interface)变量。

相反,如果定义一个结构体Lock和一个以结构体pointer为接收者的函数Test,分配一个结构体实例变量到 Locker 接口(interface) var 可以工作!

我对语言设计很困惑。谁能给我一些建议?

最佳答案

通常,Go 会在幕后为您做一些事情,这通常是其中一种情况。

当您定义一个带有结构体的函数作为接收者并将其传递给该结构体的指针时,Go 会为您进行转换:它传递指向的结构体的副本。

当您定义一个带有指针的函数作为接收者并向它传递一个结构时,Go 会创建一个指向该结构的指针。

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

对于接口(interface),Go 不会帮助你:如果你的类型没有实现方法,那么它就没有实现接口(interface)。这里没有隐藏的转换。

通常,最好清楚你想要什么以及你想要它的方式,从而防止 Go 进行那些奇怪的转换。

关于go - 指针和结构成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40112250/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com