猿问

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

以下代码(播放):


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,就可以了,所以我应该转到界面吗?


森栏
浏览 182回答 1
1回答

蓝山帝景

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.
随时随地看视频慕课网APP

相关分类

Go
我要回答