为了说明这个问题:
假设您有以下结构体,其中包含用于打印内容的方法 display (值接收器):
type ListNode struct {
Val int
Next *ListNode
}
func (l ListNode) display() {
for &l != nil {
fmt.Printf("%v ->", l.Val)
l = *l.Next
}
fmt.Println()
}
func main() {
num1 := ListNode{2, &ListNode{4, &ListNode{3, nil}}}
num1.display()
}
上面的执行将在最后一个循环中出错,因为我尝试使用以下输出取消引用 nil:
2 ->4 ->3 ->panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x109ae6f]
然而,将函数更改为指针接收器,它会优雅地变为:
func (l *ListNode) display() {
for l != nil {
fmt.Printf("%v ->", l.Val)
l = l.Next
}
fmt.Println()
}
愉快的输出:
2 ->4 ->3 ->
作为一个“新手”,我认为由于该display()函数是只读的,因此最好使用值接收器编写该函数,但遇到了这个问题。是否有一个更优雅的解决方案以及我缺少的值接收器或在原始函数中取消引用的更好方法?
炎炎设计
繁花不似锦
蛊毒传说
慕标琳琳
相关分类