我试图了解我收到错误的原因: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
提供帮助呢?
答案 0 :(得分:1)
我发现代码没有问题。也许只是代码风格和方法名称。为了使它工作,我添加了一些你应该调整和删除C ++样式注释的返回值。
请注意,由于p := &Pets{}
分配,nil接收器的问题不是问题。
https://play.golang.org/p/bavuUn9IpT
package main
import (
"fmt"
"strings"
)
type (
Cat struct {
Name string
}
Dog struct {
Name string
}
Pets struct{
c *Cat
d *Dog
}
)
func (c *Cat) Rename(d Dog) (string, error) {
name := strings.TrimSpace(d.Name)
c.Name = name
return "", nil
}
func (p *Pets) SomeFunction() (err error){
p.d = &Dog{}
p.c = &Cat{}
p.d.Name = " Foo "
p.c.Rename(*p.d)
return nil
}
func main(){
p := &Pets{}
p.SomeFunction()
fmt.Printf("%s\n", p.c.Name)
}
答案 1 :(得分:1)
@JimB已经在他的评论中指出了
您正在使用nil接收器调用
Rename
这意味着,由于您在c.Name = name
处收到错误,c
方法中的Rename
接收方为nil
。您需要确保在致电c
之前初始化Rename
。