我很想去尝试实现视频操作界面(下载,上传,转码)。在我的下载方法中,我创建了一个Reader并将其分配给struct variable' fileContent'。我之后想要在我的上传方法中访问Reader,但它会引发运行时错误。
panic:运行时错误:内存地址无效或nil指针取消引用
以下是我在go playground中的代码的链接。任何帮助都会很棒。
答案 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。