2015-11-11 67 views
0

中的读取器时,我是新来的并试图实现视频操作(下载,上载,转码)界面。在我的下载方法中,我创建了一个Reader并将其分配给结构变量'fileContent'。然后,我想在我的上传方法中访问Reader,但它会引发运行时错误。运行时错误:在访问结构

panic: runtime error: invalid memory address or nil pointer dereference

下面是我的代码在操场上的链接。任何帮助都会很棒。

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

回答

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,所以还修改NewBaseVideo返回指向结构值的指针:*BaseVideo。您可以通过采取结构字面的地址实现这一点:

func NewBaseVideo(path, name string) Video { 
    return &BaseVideo{ 
     Path: path, 
     Name: name, 
    } 
} 
+0

优秀的答案。谢谢 – myleftball

2

如果要变异的方法的价值,该方法的接收器应该是一个指针。更换

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

,并用等

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

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