【发布时间】:2017-05-17 21:40:19
【问题描述】:
我试图了解为什么会出现错误:invalid memory address or nil pointer dereference
假设我有这段代码(这不是真实的,但类似):
type (
Cat struct {
Name string
}
Dog struct {
Name string
}
Pets struct{
c *Cat
d *Dog
}
)
func (c *Cat) Rename(d Dog) string {
err := SomeErrorChecks()
name := strings.TrimSpace(d.Name)
c.Name = name // In this line is where I get the error
return err
}
func (p *Pets) SomeFunction() string{
p.d = &Dog{}
p.c = &Cat{}
p.d.Name = " Foo "
err := p.c.Rename(*p.d)
return err
}
func main(){
//some code
err := SomeFunction()
//some error handling not relevant
}
我检查了strings.TrimSpace(d.Name) 是否返回所需的字符串。我检查了c.Name 的类型是字符串。那么,如果 name 和 c.Name 是同一类型,为什么我不能将它们分配给 c.Name?
【问题讨论】:
-
显示您正在使用的实际代码。您正在使用 nil 接收器调用
Rename,但它现在显示在此处。 -
@JimB 我无法显示实际代码。我试图尽可能地重现它,编辑前面显示的代码。感谢您的帮助
-
@JimB 是对的,如果错误来自您所说的位置,那么
c就是nil。而不是检查c.Name的类型,您应该检查c不是nil在Rename方法内。 -
@IvánRodríguezTorres 这是一个例子play.golang.org/p/5YiDL3ucc6
-
@mkopriva din-din 我们有一个赢家。第一天开始编程。写一个答案,我会接受。非常感谢
标签: pointers go data-structures