以下代码(播放):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,就可以了,所以我应该转到界面吗?
1 回答
蓝山帝景
TA贡献1843条经验 获得超7个赞
bufio.NewReadWriter()
返回一个具体类型,一个指针指向一个struct
和bufio.Writer
也是一个具体类型,一个struct
。无论是*ReadWriter
和*bufio.Writer
是一个接口!
在 Go 中没有自动类型转换,您不能将不同具体类型的值分配给变量。
您有 2 个选择:
由于
bufio.ReadWriter
embeds*bufio.Writer
,您可以简单地引用它并在分配中使用它:var r *bufio.Writer r = rw.Writer
或者您可以声明
r
为一个io.Writer
(它是一个接口类型),以便您可以分配rw
给它,因为rw
实现了io.Writer
:var r io.Writer r = rw
虽然我不认为
r
在这种情况下创建特别有用,因为无论何时使用,r
您也可以使用rw
.
查看Go 规范:可分配性:
在以下任何一种情况下,值
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
是一个由 type 值表示的无类型常量T
。
没有一种情况适用于您的代码,因此它是无效的分配。
当r
被声明为 时io.Writer
,它是以下情况,因此它是有效的:
T
是一种接口类型并x
实现T
.
- 1 回答
- 0 关注
- 181 浏览
添加回答
举报
0/150
提交
取消