Golang中指针和值类型的区别与应用
Golang中指针和值类型的区别与应用 对于以下代码:
type Checkable interface {
check() bool
}
var _ Checkable = (*A)(nil)
type A struct {
}
func (a A) check() bool {
return true
}
我原本期望 var _ Checkable = (*A)(nil) 会失败,因为是 A 实现了 check 方法,而不是 *A,但它却编译通过了。https://play.golang.org/p/s3nYALUyY7D
更多关于Golang中指针和值类型的区别与应用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
非常感谢您分享对此的看法!我想我明白您的意思了。我认为一个类似的比较是:Go语言可以隐式解引用指针类型,但不会自动“引用”值类型。
就满足 Checkable 接口而言,它们是相同的。
嗯,我不确定它们是否相同。如果我使用
func (a A) check() bool {
return true
}
var _ Checkable = &A{} 会失败,并提示 A does not implement Checkable (check method has pointer receiver)
https://play.golang.org/p/y5ETER4E5Uj 构建失败。
然而,在内联代码中,下划线和类型之间没有空格,这极大地改变了语义并导致构建失败:https://play.golang.org/p/-OSVVEylIMT
func (a A) check() bool {
return true
}
和
func (a *A) check() bool {
return true
}
在满足 Checkable 接口方面是相同的。
区别在于函数接收器的类型。当 check 需要你修改 A 时,你应该选择第二种。
是的,你说得对。我之前只从接口可满足性的角度回答了你的问题,就像这个示例中展示的那样,但我现在意识到存在一个2x2的情况矩阵。
但回到你最初的例子:我最好的猜测是它能工作,是因为你总是可以从指针获取值接收器(即使在运行时可能会引发panic)。当值在栈中通过函数调用传递时会被复制(从而获得不同的指针),在这种情况下,从值结构体获取指针接收器是没有意义的。
不过,我很想听听其他人怎么说。好问题!


