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)
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
我有以下代码可以正常工作:
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)
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