Обращение по нулевому указателю при попытке скопировать указатель на указатель - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть следующий фрагмент кода, работающий корректно:

type Type struct {
    p string
}

func foo() {
    t := Type { p: "hola" }
    bar(&t)
}

var bar = func(t *Type) {
    t.p = "chau"
}

func Test1() {
    var baz *Type
    bar = func(t *Type) {
        baz = t
    }
    foo()
    fmt.Println(baz.p)
}

По сути, я высмеиваю функцию бара, чтобы узнать параметр, который функция foo передает при запуске. Теперь предположим, что я хочу извлечь логи c функции пересмешки в другую функцию, как мне это сделать? Я попробовал следующее, но получил invalid memory address or nil pointer dereference:

func mockedBar(b** Type) func(*Type) {
    return func(t *Type) {
        *b = t
    }
}

func Test2() {
    var baz **Type
    bar = mockedBar(baz)
    foo()
    fmt.Println((**baz).p)
}

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

var означает, что вы выделите следующую переменную с данным типом.

var t Type выделит полный размер типа, например 24 байта.

var p *Type выделит только 4-8 байт для самого указателя.

var pp **Type выделит те же 4-8 байт, потому что это тот же указатель, но который указывает на другой указатель.

Для решения та головоломка, которую вы должны:

// allocate an object and take a pointer to it
p := &Type{}
/*
it's also equivalent of:

var t Type
p := &t 
*/

// take a pointer to pointer
pp := &p
0 голосов
/ 21 февраля 2020

Используйте это:

var baz *Type
bar = mockedBar(&baz)
foo()
fmt.Println((*baz).p)

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

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