为了账号安全,请及时绑定邮箱和手机立即绑定

在 golang 中,为什么我不能将结构用作嵌套结构类型?

在 golang 中,为什么我不能将结构用作嵌套结构类型?

Go
森栏 2021-10-18 16:14:42
以下代码(播放):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()返回一个具体类型,一个指针指向一个structbufio.Writer也是一个具体类型,一个struct。无论是*ReadWriter*bufio.Writer是一个接口

在 Go 中没有自动类型转换,您不能将不同具体类型的值分配给变量。

您有 2 个选择:

  1. 由于bufio.ReadWriterembeds *bufio.Writer,您可以简单地引用它并在分配中使用它:

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

    var r io.Writer
    r = rw

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

查看Go 规范:可分配性

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

  • x的类型与T.

  • x的类型VT具有相同的基础类型,并且至少有一个VT不是命名类型。

  • T是一种接口类型并x实现T.

  • x是双向通道值,T是通道类型,x的类型V并且T具有相同的元素类型,并且至少有一个VT不是命名类型。

  • x是预先声明的标识符nilT是指针、函数、切片、映射、通道或接口类型。

  • x是一个由 type 值表示的无类型常量T

没有一种情况适用于您的代码,因此它是无效的分配。

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

T是一种接口类型并x实现T.


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信