go新手对于golang接口的一点疑惑

Elu0 · · 3014 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

内容有点多,请大家耐心看完: 大家好,我最近看了一下Russ Cox关于interface的博文http://research.swtch.com/interfaces 其中提到接口的数据结构其实由连个字段组成:其中一个保存与该接口相关连的具体数据的值(当然也可能是指向值的指针);而另一个则存储的是指向接口表的指针,该表中既存储着关联该接口的具体数据的类型,又包含了实现该接口所需所有方法的指针,而不属于该接口的方法是不会保存进来的。 后来,我又看到在另一篇博文中,有如下的代码: ```golang var r io.Reader tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0) if err != nil { return nil, err } r = tty var w io.Writer w = r.(io.Writer) ``` io.Reader是仅含有Read()方法的接口,而io.Writer则仅含有Write()方法,也就是说上述的代码完成了两个完全无关的接口的转换,只要与Reader接口相关连的具体对象同时实现了这两种接口。 于是我就有了疑惑:如果如Russ Cox在博文中所说,接口对象只是存储了与其相关连的具体对象的部分数据,而非全部(因为与接口不相符的方法,是不会在接口表中有条目的)。那么上述代码中r自身的数据结构中就应该只存有Read()方法的,它是怎么成功通过io.Writer类型断言,并成功转换为Writer接口的呢。 我个人认为,似乎只有r中保存有关联的具体对象的所有方法,上述代码才能成立,所以我觉得这两篇博文有矛盾之处。`当然我并不是说这两篇文章有什么错误`,我只是觉得,我这样的菜鸟,对go语言的理解不可能透彻,一定是我疏忽了某些内容,才会有上述的疑惑。所以想请各位gopher帮我解解惑,我将不胜感激。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3014 次点击  
加入收藏 微博
2 回复  |  直到 2014-12-11 05:55:22
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传