猿问

运行时错误:在结构中访问 Reader 时

我是新手,正在尝试为视频操作(下载、上传、转码)实现一个接口。在我的下载方法中,我创建了一个 Reader 并将其分配给结构变量“fileContent”。然后我想在我的上传方法中访问阅读器,但它引发了运行时错误。

恐慌:运行时错误:无效的内存地址或零指针取消引用

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

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


三国纷争
浏览 143回答 2
2回答

桃花长相依

问题是您使用的是非指针接收器: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,    }}

哆啦的时光机

如果你想改变方法中的值,方法的接收者应该是一个指针。代替func (b BaseVideo) Download() (err error)和这样的func (b *BaseVideo) Download() (err error)操场上的工作代码:https : //play.golang.org/p/hZ8-RwzVYh。
随时随地看视频慕课网APP

相关分类

Go
我要回答