关于nil的理解,调用nil point值方法报错问题

来源:4-1 结构体和方法

慕工程3002471

2019-07-21

http://img.mukewang.com/szimg/5d3405810847443b05460268.jpg

老师,关于go允许调用nil指针的方法的问题;上面是和老师一样的代码,我尝试运行如下代码

var nilNode *treeNode
nilNode.setValue(900)
nilNode.print()

'Node is nil, ignored'被打印了,但是print函数在runtime时报错了:

panic: runtime error: invalid memory address or nil pointer dereference

如果我加上23-25的代码 编译器又不过说nil不能转为treeNode值。

而如果我如下这样判断的话,编译器过了,runtime还是报nil pointer的错

if &node == nil {
   return
}

我想我对nil的理解和判断有问题,按照这个设计的话,函数接受者默认是可能为nil的,所以在runtime可以报错,那么在所有方法里都要做nil check?

而既然编译器允许调用nil.print()的值方法,如何在print方法内做检测呢?

看似不能直接理解为Swift里的nil和optional

写回答

1回答

慕工程2383720

2019-07-21

一个是对象调用,一个是指针调用。
对象调用,对象可以通过指针找到对象。指针调用,其根本上,就是通过寻址到对象,然后进行调用。
其本质上,都是对象调用。
明确这个之后,我们再看下你的问题。
对象调用,nil指针指向的是nil,而如果是直接把nil当成对象,进行调用,估计编译期间都过不了。
因为编译器会对对象内存,进行检测。
你在对象调用里进行判空,会变得毫无意义。

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程