为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
三国纷争 2021-11-22 15:32:08
我是新手,正在尝试为视频操作(下载、上传、转码)实现一个接口。在我的下载方法中,我创建了一个 Reader 并将其分配给结构变量“fileContent”。然后我想在我的上传方法中访问阅读器,但它引发了运行时错误。恐慌:运行时错误:无效的内存地址或零指针取消引用下面是我在 go playground 中的代码的链接。任何帮助都会很棒。https://play.golang.org/p/ib38IQ6AZI
查看完整描述

2 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

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


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,

    }

}


查看完整回答
反对 回复 2021-11-22
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

如果你想改变方法中的值,方法的接收者应该是一个指针。代替

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

和这样的

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

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


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信