Go 在戈兰为什么我能';是否将结构用作嵌套结构类型?

Go 在戈兰为什么我能';是否将结构用作嵌套结构类型?,go,interface,type-conversion,embedding,Go,Interface,Type Conversion,Embedding,以下代码(): 给出以下编译时错误: cannot use rw (type *bufio.ReadWriter) as type *bufio.Writer in assignment 我所期望的是使用结构作为嵌套结构类型。但是,如果我将r声明为io.Reader,这就可以了,那么我应该移到接口吗?其他类型无法分配,转到不支持扩展。返回具体类型,指向结构的指针,也是具体类型,即结构。无论是*ReadWriter还是*bufio.Writer都不是 在Go中,没有自动类型转换,不能为变量指定不

以下代码():

给出以下编译时错误:

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

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

其他类型无法分配,转到不支持扩展。

返回具体类型,指向
结构的指针,也是具体类型,即
结构。无论是
*ReadWriter
还是
*bufio.Writer
都不是

在Go中,没有自动类型转换,不能为变量指定不同具体类型的值

您有两种选择:
  • 由于
    bufio.ReadWriter
    嵌入了
    *bufio.Writer
    ,您只需参考它并在作业中使用它即可:

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

    var r io.Writer
    r = rw
    
    虽然我不认为在这种情况下创建
    r
    特别有用,因为无论何时使用
    r
    都可以使用
    rw

  • 退房:

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

    • x
      的类型与
      T
      相同
    • x
      的类型
      V
      T
      具有相同的基础类型,并且
      V
      T
      中至少有一个不是命名类型
    • T
      是一种接口类型,
      x
      实现
      T
    • x
      是双向通道值,
      T
      是通道类型,
      x
      的类型
      V
      T
      具有相同的元素类型,并且
      V
      T
      中至少有一个不是命名类型
    • x
      是预先声明的标识符
      nil
      T
      是指针、函数、切片、映射、通道或接口类型
    • x
      是一个非类型常量,可由
      T
      类型的值表示
    所有情况都不适用于您的代码,因此它是无效的赋值

    r
    被声明为
    io.Writer
    时,它是以下情况,因此它是有效的:

    T
    是一种接口类型,
    x
    实现
    T


    为什么bufio的读写器首先不是一个界面?
    var r io.Writer
    r = rw