在golang中为什么我不能将struct用作嵌套的struct类型?

时间:2015-07-01 08:27:07

标签: go interface type-conversion embedding

以下代码(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

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

2 个答案:

答案 0 :(得分:3)

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实现{ {1}}:

    var r io.Writer
    r = rw
    

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

  3. 结帐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

答案 1 :(得分:-3)

不同的类型不能分配,GO不支持扩展。

相关问题