运行时错误:在struct中访问Reader时

时间:2015-11-11 11:24:09

标签: go

我很想去尝试实现视频操作界面(下载,上传,转码)。在我的下载方法中,我创建了一个Reader并将其分配给struct variable' fileContent'。我之后想要在我的上传方法中访问Reader,但它会引发运行时错误。

  

panic:运行时错误:内存地址无效或nil指针取消引用

以下是我在go playground中的代码的链接。任何帮助都会很棒。

https://play.golang.org/p/ib38IQ6AZI

2 个答案:

答案 0 :(得分:3)

问题在于您使用的是非指针接收器:

func (b BaseVideo) Download() (err error) {
    b.fileContent = bytes.NewReader([]byte("abc"))
    return nil
}

这意味着您的Download()方法会获得您正在调用它的BaseVideo值的副本。您可以在方法内修改此副本(为Reader字段指定新的fileContent),但原始的BaseVideo 不会被修改

解决方案:使用指针接收器:

func (b *BaseVideo) Download() (err error) {
    b.fileContent = bytes.NewReader([]byte("abc"))
    return nil
}

当然,如果您将接收器修改为指针,则类型BaseVideo将不再实现Video接口,只会指向BaseVideo的指针,因此也会修改{{1}返回指向struct值的指针:NewBaseVideo。您可以通过获取struct literal的地址来实现此目的:

*BaseVideo

答案 1 :(得分:2)

如果要在方法中改变值,则方法的接收者应该是指针。取代

func (b BaseVideo) Download() (err error)

func (b *BaseVideo) Download() (err error)

操场上的工作代码:https://play.golang.org/p/hZ8-RwzVYh