【问题标题】:Runtime error: When accessing a Reader in struct运行时错误:在结构中访问 Reader 时
【发布时间】:2015-11-12 02:11:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: go


    【解决方案1】:

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

    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,
        }
    }
    

    【讨论】:

    • 优秀的答案。谢谢
    【解决方案2】:

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

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

    等等

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 2016-08-03
      相关资源
      最近更新 更多