gpt4 book ai didi

go - Go 中不明确的转换语法

转载 作者:IT王子 更新时间:2023-10-29 01:49:22 26 4
gpt4 key购买 nike

我有以下类型定义:

type reader io.Reader

我希望这个reader 类型实现io.Reader 接口(interface),所以我这样做:

func (r reader) Read(p []byte) (n int, err error) {
return io.Reader(r).Read(p)
}

问题是这样的:io.Reader(r) 可能意味着以下两种情况之一:

  • r 转换为其基础类型 (io.Reader)
  • 静态断言(由编译器检查)r 满足 io.Reader 接口(interface)(因为我们定义了一个 Read([]byte) (int , error) 方法,确实如此)。创建一个新的 io.Reader 接口(interface)值并将 r 存储在其中。

我希望前者发生。如果是后者,当我调用 io.Reader(r).Read(p) 时,它会调用 r 的底层 Read 方法(我们现在在里面),它会无限循环。我希望 发生的是提取底层 io.Reader inside r,并使用 它的 Read 方法。

当然,我可以在实践中测试看看这两个问题中的哪一个发生了,但我总体上对 Go 编译器如何解决这些问题感到好奇。我在语言规范中找不到相关信息。

最佳答案

您不能使用定义为 io.Reader 的接口(interface)类型 reader 作为 func (r reader) {} 中的接收器类型.

您需要将阅读器类型定义为特定类型

type reader struct {
// stuff
}

为了回答您的问题,io.Reader(r) 意味着在编译时断言 r 满足 io.Reader 接口(interface),并且创建一个新的 io.Reader 接口(interface)值并将 r 存储在其中。 (您的第二选择)。

因此,如果您尝试上述操作,您将获得无限递归。

底层 io.Reader 的想法在 Go 中没有意义,因为你不能在接口(interface)上定义方法,只能在具体类型上定义。

您当然可以将类型相互嵌入,看起来像这样

type reader struct {
other io.Reader
}

然后你会调用它

func (r reader) Read(p []byte) (n int, err error) {
return r.other.Read(p)
}

关于go - Go 中不明确的转换语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23094593/

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