【发布时间】:2015-11-12 02:11:17
【问题描述】:
我是新手,正在尝试为视频操作(下载、上传、转码)实现接口。在我的下载方法中,我正在创建一个阅读器并将其分配给结构变量“fileContent”。然后我想在我的上传方法中访问阅读器,但它会引发运行时错误。
恐慌:运行时错误:无效的内存地址或 nil 指针取消引用
下面是我在 go playground 中的代码的链接。任何帮助都会很棒。
【问题讨论】:
标签: go
我是新手,正在尝试为视频操作(下载、上传、转码)实现接口。在我的下载方法中,我正在创建一个阅读器并将其分配给结构变量“fileContent”。然后我想在我的上传方法中访问阅读器,但它会引发运行时错误。
恐慌:运行时错误:无效的内存地址或 nil 指针取消引用
下面是我在 go playground 中的代码的链接。任何帮助都会很棒。
【问题讨论】:
标签: go
问题在于您使用的是非指针接收器:
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
}
当然如果修改receiver为指针,BaseVideo类型将不再实现Video接口,只是一个指向BaseVideo的指针,所以还要修改NewBaseVideo返回一个指向结构值:*BaseVideo。您可以通过获取结构文字的地址来实现这一点:
func NewBaseVideo(path, name string) Video {
return &BaseVideo{
Path: path,
Name: name,
}
}
【讨论】:
如果你想改变方法中的值,方法的接收者应该是一个指针。替换
func (b BaseVideo) Download() (err error)
等等
func (b *BaseVideo) Download() (err error)
操场上的工作代码:https://play.golang.org/p/hZ8-RwzVYh。
【讨论】: