我正在使用 golang 指针进行一些空检查。但我对如何检查 nil 情况感到非常困惑。它和C有很大不同。例如有一个mock对象
type Node struct {
Val int
Next *Node
}
当我创建对象时
a := &Node{Val:1,Next:nil}
并且我想判断a的下一个值是否为空。我使用以下代码
if *a.Next == nil{}
但是编译器会抛出类型不对齐的错误。这不是指对象(由点引用)的 Next 属性吗?当我用 () 包裹 *a 后,它就起作用了。 所以我不知道为什么 * 运算符不起作用。
另一个问题是,当我使用以下内容时
if a.Next == nil {}
它也工作得很好。但这很奇怪。由于 a 应该引用包含对象的内存地址值。内存地址不能有“Next”属性,只有对象才有。 那么为什么a.Next可以获取值而不是抛出异常呢?
感到困惑。
if *a.Next == nil{}
但是编译器会抛出类型不对齐的错误。这不是指对象(由点引用)的 Next 属性吗?在我用 () 包裹 *a 后,它就起作用了。所以我不知道为什么 * 运算符不起作用。
因为
*a.Next
的意思是*(a.Next)
,而不是(*a).Next
。如果你的意思是后者,你就必须写得如此明确......如果 Go 创建者不认为这很烦人,并放入构成问题第二部分的例外:
另一个问题是,当我使用以下内容时
if a.Next == nil {}
它也工作得很好。但这很奇怪。由于 a 应该引用包含对象的内存地址值。内存地址不能有“Next”属性,只有对象才有。那么为什么a.Next可以获取值而不是引发异常呢?
来自 规格(选择器):
作为例外,如果
的类型是 defined 指针类型并且x
是表示字段(但不是方法)的有效选择器表达式,则(*x).f
是x.f
的简写。(*x).f
因此,
(*a).Next
可以写成a.Next
,不会产生歧义。
请记住,虽然 Go 是 C 的后代,但这并不意味着它的语义与 C 相同。