以下代码(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
,这样就可以了,我应该转到界面吗?
答案 0 :(得分:3)
bufio.NewReadWriter()
返回一个具体类型,指向struct
的指针,bufio.Writer
也是具体类型,struct
。 *ReadWriter
和*bufio.Writer
都不是interface!
在Go中没有自动类型转换,您不能将不同具体类型的值分配给变量。
由于bufio.ReadWriter
嵌入*bufio.Writer
,您可以简单地引用它并在作业中使用它:
var r *bufio.Writer
r = rw.Writer
或者您可以将r
声明为io.Writer
(它是一种接口类型),以便您可以为rw
分配rw
因为io.Writer
实现{ {1}}:
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
。
答案 1 :(得分:-3)
不同的类型不能分配,GO不支持扩展。