Чтобы проиллюстрировать вопрос:
Скажем, у вас есть следующая структура с методом 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()
}
Вышеуказанное выполнениепроизойдет ошибка в последнем цикле, поскольку я попытался отменить ссылку на ноль с помощью этого вывода:
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()
предназначена только для чтения, было бы лучше написать функцию с получателем значения,но столкнуться с этим вопросом. Есть ли более изящное решение с отсутствующим приемником значений или лучший способ отменить ссылку в исходной функции?