本篇是煎鱼回答记者,啊不是,回答读者的提问,内容分析的不错。注意文里的读者群不是我的,我就只有公众号,以文会友,看完想走就走,赞不赞的不重要,如果想了解哪方面内容可以直接留言或者私信。
最近在我们 Go 的技术交流群里,有一个小伙伴提了一个程序方面的问题,还挺有意思的,分享给大家。
示例
示例程序如下:
type T struct{}
func (t *T) Hello() string {
if t == nil {
fmt.Println("脑子进煎鱼了")
return ""
}
return "煎鱼进脑子了"
}
func main() {
var t *T
t.Hello()
这段程序的运行结果是什么?
tHello
运行结果是:
panic: runtime error: invalid memory address or nil pointer dereference
对不对呢?
显然,真正的运行结果是:
脑子进煎鱼了
请你思考一下,想想这是为什么?
为什么
t
更抽象化来讲,就是 ”程序是如何检查对象指针来寻找和调度所需函数“。
Expression.NameExpression
其调用函数的指向不是由该表达式的特定运行时值来决定,包括我们前面所提到的 nil。
具体如下:
func (p *Sometype) Somemethod (firstArg int) {}
本质上是:
func SometypeSomemethod(p *Sometype, firstArg int) {}
这么一看,其实大家应该都明白了。
p *Sometypenil.Somemethod
与值是不是 nil,是什么,没有太多直接的影响。只要有预期的上下文类型就可以了。
总结
今天给大家分享了一个 Go 语言里面的一个小细节,平时可能很多人没注意到,毕竟 IDE 也会标黄,会避开这个问题点。
在理解 Go 的设计和思考上,我们是需要清晰其背后的原因和逻辑的,也就是类型决定其调用,而不是值(容易误判)。
关注煎鱼,获取业内第一手消息和知识 👇
煎鱼,Go圈网红技术博主,出版过 Go 畅销书《Go 语言编程之旅》,