Установить указатель на ноль из метода или функции - PullRequest
0 голосов
/ 16 февраля 2019

Почему обе эти destroy функции не меняют указатель на ноль и как я могу создать такую ​​функцию?

package main

import (
    "fmt"
)

type position struct {
    x int
    y int
}

func (p *position) destroy() {
    p = nil
}

func destroy(p *position) {
    p = nil
}

func main() {
    p1 := &position{1,1}
    p2 := &position{2,2}
    p1.destroy()
    destroy(p2)

    if p1 == nil {
        fmt.Println("p1 == nil")
    } else {
        fmt.Println(p1)
    }

    if p2 == nil {
        fmt.Println("p2 == nil")
    } else {
        fmt.Println(p2)
    }

}

Выходы:

&{1 1}
&{2 2}

https://play.golang.org/p/BmZjX1Hw24u

1 Ответ

0 голосов
/ 16 февраля 2019

Вам нужен указатель на указатель , чтобы изменить значение указателя.

Вот пример кода, модифицированный для этого ( детская площадка ):

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 указано, что раздел о вызовах и параметрах вызова :

После оценки параметры вызова передаются функции по значению и вызываемая функция начинает выполнение.Возвращаемые параметры функции передаются по значению обратно в вызывающую функцию, когда функция возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...