麻烦在GO中设定价值

时间:2017-05-17 21:40:19

标签: pointers go data-structures

我试图了解我收到错误的原因: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的类型是字符串。那么,如果两者属于同一类型,为什么我无法namec.Name提供帮助呢?

2 个答案:

答案 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

Example