为什么golang指针可以直接获取对象的属性

问题描述 投票:0回答:1

我正在使用 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可以获取值而不是抛出异常呢?

感到困惑。

list go pointers
1个回答
0
投票
if *a.Next == nil{}

但是编译器会抛出类型不对齐的错误。这不是指对象(由点引用)的 Next 属性吗?在我用 () 包裹 *a 后,它就起作用了。所以我不知道为什么 * 运算符不起作用。

因为

*a.Next
的意思是
*(a.Next)
,而不是
(*a).Next
。如果你的意思是后者,你就必须写得如此明确......如果 Go 创建者不认为这很烦人,并放入构成问题第二部分的例外:

另一个问题是,当我使用以下内容时

if a.Next == nil {}

它也工作得很好。但这很奇怪。由于 a 应该引用包含对象的内存地址值。内存地址不能有“Next”属性,只有对象才有。那么为什么a.Next可以获取值而不是引发异常呢?

来自 规格(选择器)

作为例外,如果

x
的类型是 defined 指针类型并且
(*x).f
是表示字段(但不是方法)的有效选择器表达式,则
x.f
(*x).f
的简写。

因此,

(*a).Next
可以写成
a.Next
,不会产生歧义。

请记住,虽然 Go 是 C 的后代,但这并不意味着它的语义与 C 相同。

© www.soinside.com 2019 - 2024. All rights reserved.