Nil 指针解引用试图将指针复制到指针

Nil pointer dereference trying to copy pointer to pointer

我有以下代码可以正常工作:

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)
}

基本上,我在模拟 bar 函数,以便了解函数 foo 在运行时传递的参数。现在,假设我想在另一个函数中提取模拟函数的逻辑,我应该怎么做?我尝试了以下但得到了 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)
}

使用这个:

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

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

var 表示您将分配给定类型的以下变量。

var t Type 将分配 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