关于php:为什么-Go-里值为-nil-可以调用函数

3次阅读

共计 1048 个字符,预计需要花费 3 分钟才能阅读完成。

大家好,我是煎鱼。

最近在咱们 Go 的技术交换群里,有一个小伙伴提了一个程序方面的问题,还挺有意思的,分享给大家。

示例

示例程序如下:

type T struct{}

func (t *T) Hello() string {
    if t == nil {fmt.Println("脑子进煎鱼了")
        return ""
    }

    return "煎鱼进脑子了"
}

func main() {
    var t *T
    t.Hello()

这段程序的运行后果是什么?

从程序的剖析来看,变量 t 并没有初始化,只是申明了类型。而后就间接调用了 Hello 办法,像是 nil 调用函数,实践上应该呈现恐慌(panic)。

运行后果是:

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

对不对呢?

显然,真正的运行后果是:

脑子进煎鱼了

请你思考一下,想想这是为什么?

为什么

问题的起因是:很多小伙伴认为变量 t 的值都是 nil 了,不应该还能调用到才对。

更抽象化来讲,就是”程序是如何查看对象指针来寻找和调度所需函数“。

实际上,在 Go 中,表达式 Expression.Name 的语法,所调用的函数齐全由 Expression 的类型决定。

其调用函数的指向不是由该表达式的特定运行时值来决定,包含咱们后面所提到的 nil。

具体如下:

func (p *Sometype) Somemethod (firstArg int) {}

实质上是:

func SometypeSomemethod(p *Sometype, firstArg int) {}

这么一看,其实大家应该都明确了。

上述入参 p *Sometype 是有具体上下文类型的,自然而然也就能调用到相应的办法。如果是没有任何上下文类型的,例如:nil.Somemethod 办法来调用,那必定就是无奈运行的。

与值是不是 nil,是什么,没有太多间接的影响。只有有预期类型的上下文就能够了。

总结

明天给大家分享了一个 Go 语言外面的一个小细节,平时可能很多人没留神到,毕竟 IDE 也会标黄,会避开这个问题点。

在了解 Go 的设计和思考上,咱们是须要清晰其背地的起因和逻辑的,也就是类型决定其调用,而不是值(容易误判)。

你有没有遇到过其它的细节问题呢,欢送交换:)

若有任何疑难欢送评论区反馈和交换,最好的关系是相互成就 ,各位的 点赞 就是煎鱼创作的最大能源,感激反对。

文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。

正文完
 0