【问题标题】:Trouble assigning value in GO在 GO 中赋值问题
【发布时间】: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 的类型是字符串。那么,如果 namec.Name 是同一类型,为什么我不能将它们分配给 c.Name

【问题讨论】:

  • 显示您正在使用的实际代码。您正在使用 nil 接收器调用 Rename,但它现在显示在此处。
  • @JimB 我无法显示实际代码。我试图尽可能地重现它,编辑前面显示的代码。感谢您的帮助
  • @JimB 是对的,如果错误来自您所说的位置,那么c 就是nil。而不是检查c.Name 的类型,您应该检查c 不是nilRename 方法内。
  • @IvánRodríguezTorres 这是一个例子play.golang.org/p/5YiDL3ucc6
  • @mkopriva din-din 我们有一个赢家。第一天开始编程。写一个答案,我会接受。非常感谢

标签: pointers go data-structures


【解决方案1】:

正如@JimB 在他的评论中已经指出的那样

您正在使用 nil 接收器调用 Rename

这意味着,由于您在c.Name = name 收到错误,因此Rename 方法内的c 接收器是nil。你需要确保在调用Rename之前初始化c

Example

【讨论】:

  • 感谢@JimB 的回答。
  • 在我的分配p := &Pets{}的示例中没有出现nil接收器的问题
【解决方案2】:

我认为代码没有问题。也许只是代码样式和方法名称。为了让它工作,我添加了一些你应该调整的返回值,并删除了 C++ 样式的 cmets。

请注意,由于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)
}

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 2020-07-04
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2011-03-04
    • 2011-06-04
    相关资源
    最近更新 更多