为何可以这样传递参数

讨论 未结 3 44
seers
seers 会员 2022年4月21日 12:46 发表
<p>初学,有个疑惑的地方,例如</p> <pre><code>file, err := os.Open("/path/to/file.txt") scanner := bufio.NewScanner(file) </code></pre> <p>这里 file 获传入 bufio.NewScanner ,但是文档写的是</p> <pre><code>func Open(name string) (*File, error) func NewScanner(r io.Reader) *Scanner </code></pre> <p>这里接受的是参数是 r io.Reader ,为何 file 可以传过去,是否是因为 file 实现了接口导致的,我在文档里面也没有看到有提及,如果是这样在哪里可以看到哪些参数实现了哪些接口呢,不能要用的时候一个个去断言吧?</p>
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
3个回复
  • gamexg
    2022年4月21日 13:44
    的确是因为 file 实现了 io.Reader 接口导致的。 这是 golang 的特点,不需要明确声明支持某个接口,只要函数名和参数类型一致,就可以认为实现了对应的接口。
    0 0
  • Elaina
    2022年4月21日 14:17
    golang 的接口是 duck type ,只要实现了某个接口的所有方法就是实现了某个接口,用 Goland 跳转到源码,或者直接查 API 文档查看吧,目前貌似没有什么方便的方法一键查看。
    0 0
  • janxin
    2022年4月21日 14:45
    是实现了接口,所以才可以传进去。背景知识可以先了解一下什么是鸭子类型。 首先你自己要清楚你想要干什么。判断有一个简单的办法是你有变量 abc 你试一试就知道了,一般 lsp 或者 ide 自动提示你是否满足接口。当然如果你如果只是单纯想找不同的实现,那估计是没地方了。不过后面这种情况没什么实际应用场景,大多是学习场景。
    0 0