【问题标题】:In golang why I can't use the struct as nested struct type?在 golang 中,为什么我不能将结构用作嵌套结构类型?
【发布时间】:2015-09-18 07:25:15
【问题描述】:

以下代码(play):

func main() {
    buf := bytes.NewBuffer(make([]byte, 0))
    rw := bufio.NewReadWriter(bufio.NewReader(buf), bufio.NewWriter(buf))
    var r *bufio.Writer
    r = rw
}

给出以下编译时错误:

cannot use rw (type *bufio.ReadWriter) as type *bufio.Writer in assignment

我期望的是使用结构作为嵌套结构类型。但是如果我将r 声明为io.Reader 就可以了,那我应该转到界面吗?

【问题讨论】:

    标签: go interface type-conversion embedding


    【解决方案1】:

    不同类型不能赋值,GO不支持扩展。

    【讨论】:

      【解决方案2】:

      bufio.NewReadWriter() 返回一个具体类型,一个指向struct 的指针,bufio.Writer 也是一个具体类型,一个struct*ReadWriter*bufio.Writer 都不是 interface

      在 Go 中没有自动类型转换,您不能将不同具体类型的值分配给变量。

      你有两个选择:

      1. 由于bufio.ReadWriter 嵌入了*bufio.Writer,您可以简单地引用它并在作业中使用它:

        var r *bufio.Writer
        r = rw.Writer
        
      2. 或者您可以将r 声明为io.Writer(它是一种接口类型),以便您可以将rw 分配给它,因为rw 实现了io.Writer

        var r io.Writer
        r = rw
        

        虽然我不认为在这种情况下创建r 特别有用,因为无论何时使用r,您也可以使用rw

      查看Go spec: Assignability:

      x 可分配给T 类型的变量(“x 可分配给T”)在任何这些情况下:

      • x 的类型与 T 相同。
      • x 的类型 VT 具有相同的基础类型,并且 VT 中的至少一个不是命名类型。
      • T 是一个接口类型,x 实现了T
      • x是双向通道值,T是通道类型,x的类型VT具有相同的元素类型,并且VT至少有一个不是命名类型。
      • x 是预声明的标识符 nilT 是指针、函数、切片、映射、通道或接口类型。
      • x 是一个无类型常量,可以用 T 类型的值表示。

      这些情况都不适用于您的代码,因此它是无效的分配。

      r被声明为io.Writer时,属于以下情况,因此有效:

      T 是一个接口类型,x 实现了T

      【讨论】:

      • 为什么bufio读写器一开始就不是一个接口?
      猜你喜欢
      • 2015-08-14
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 2021-12-24
      • 2017-12-24
      相关资源
      最近更新 更多