以下代码(播放):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.ReadWriterembeds*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 关注
- 245 浏览
添加回答
举报
0/150
提交
取消
