Вам нужен указатель на указатель , чтобы изменить значение указателя.
Вот пример кода, модифицированный для этого ( детская площадка ):
package main
import (
"fmt"
)
type position struct {
x int
y int
}
func destroy(p **position) {
*p = nil
}
func main() {
p1 := &position{1, 1}
destroy(&p1)
if p1 == nil {
fmt.Println("p1 == nil")
} else {
fmt.Println(p1)
}
}
В вашем текущем коде
func destroy(p *position) {
p = nil
}
Внутри destroy
, p
- это значение, содержащее адрес структуры position
.Назначая что-то самому p
, вы просто заставляете его хранить адрес какой-то другой структуры position
(или nil
).Вы не изменяете исходный переданный указатель.
Это ничем не отличается от функции, пытающейся изменить свой аргумент путем присвоения ему:
// This will not actually modify the argument passed in by the caller
func setto2(value int) {
value = 2
}
В спецификации go указано, что раздел о вызовах и параметрах вызова :
После оценки параметры вызова передаются функции по значению и вызываемая функция начинает выполнение.Возвращаемые параметры функции передаются по значению обратно в вызывающую функцию, когда функция возвращает.