pointer receiver 为nil 时 ,函数依然可以正常执行,只有保证执行方面中没有调用receiver相关属性或方法。 这个 Java 中 对象为空,调用方法时出现NullPointerException 完全不一样。
package main
import (
"fmt"
)
type Cat struct {
}
func (c *Cat) Speak() string {
return "Cat Speak!"
}
func main() {
var cat *Cat
fmt.Println(cat)
fmt.Println(cat.Speak())
}
// output
<nil>
Cat Speak!
如果是value receiver 使用pointer receiver 调用会编译错误
package main
import (
"fmt"
)
type Cat struct {
}
func (c Cat) Speak() string {
return "Cat Speak!"
}
func main() {
var cat *Cat
fmt.Println(cat)
fmt.Println(cat.Speak())
}
//output
<nil>
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0xe0244]
goroutine 1 [running]:
main.main()
/tmp/sandbox321387350/prog.go:18 +0x84