【问题标题】:Calling methods on interface pointers in Go在 Go 中调用接口指针上的方法
【发布时间】:2014-04-08 04:40:32
【问题描述】:

我仍然对 Go 中接口和指针的更精细细节感到困惑。我遇到了一个包含指向net.Conn 的指针的简单类型的问题。当我尝试在指针上调用方法(关闭)时,我收到type *net.Conn has no field or method Close

这是一个突出问题的简单示例:http://play.golang.org/p/Q4LB0wi6Tk

在这里调用Close() 的正确方法是什么?

【问题讨论】:

  • 我已经用 Go 搞砸了几个月,来自 C++/Delphi 等 - 遇到了同样的困惑 - 我的一些关于它的问题都在这里。从这里的 GoPhers 家伙那里拿走它,忘记你从其他语言中的概念 - Go 看起来像 C,但不像它...

标签: pointers interface go


【解决方案1】:

简短的回答是“不要使用指向接口的指针”。很少需要它们,最终会出现像您看到的那样令人困惑的错误。

您也永远不会使用new() 创建指向空接口的指针。接口由具体类型隐式满足。

【讨论】:

  • 好吧,这很公平,我之前肯定读过。那么我的问题是; net.Conn 背后的底层类型必须分配在某个地方。是否不值得担心在整个程序中传递 net.Conn 的副本?从表面上看,这似乎效率低下,但也许我对传递引用/值的理解与其他语言有偏差。
  • @uidzer0 net.Conn 是一个非常小的 2 字结构。复制它比取消引用指针要快。
  • @uidzer0,也忘了传递引用——Go 中的一切都是传递值(实际上,大多数语言都是这种情况)。指针只是您可以传递的另一个值。
【解决方案2】:

net.Conn 是一个小的(两个字)结构。如果实现是一个指针,那么持有该实现的 net.Conn 也像一个指针。请参阅 http://research.swtch.com/interfaces 了解接口如何在后台工作。

【讨论】:

  • 感谢 Russ,JimB 巩固了我在传递指针方面的思路。我只想对您发表的详细文章表示感谢。我无数次在你的网站上发现自己。
猜你喜欢
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
相关资源
最近更新 更多