gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:23:54 26 4
gpt4 key购买 nike

以下代码(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

我期望的是将结构用作嵌套结构类型。但是,如果我将 r 声明为 io.Reader,就可以了,那么我应该转到接口(interface)吗?

最佳答案

bufio.NewReadWriter()返回一个具体类型,一个指向 structbufio.Writer 的指针也是一个具体类型,一个struct*ReadWriter*bufio.Writer 都不是 interface !

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

您有 2 个选择:

  1. 由于 bufio.ReadWriter 嵌入了 *bufio.Writer,您可以简单地引用它并在作业中使用它:

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

    var r io.Writer
    r = rw

    尽管我认为在这种情况下创建 r 并不是特别有用,因为无论何时您要使用 r,您也可以使用 rw

查看 Go spec: Assignability :

A value x is assignable to a variable of type T ("x is assignable to T") in any of these cases:

  • x's type is identical to T.
  • x's type V and T have identical underlying types and at least one of V or T is not a named type.
  • T is an interface type and x implements T.
  • x is a bidirectional channel value, T is a channel type, x's type V and T have identical element types, and at least one of V or T is not a named type.
  • x is the predeclared identifier nil and T is a pointer, function, slice, map, channel, or interface type.
  • x is an untyped constant representable by a value of type T.

所有情况都不适用于您的代码,因此它是无效的赋值。

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

T is an interface type and x implements T.

关于go - 在 golang 中,为什么我不能将结构用作嵌套结构类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31156217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com