V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
seers
V2EX  ›  Go 编程语言

为何可以这样传递参数

  •  
  •   seers · 2022-04-21 20:29:17 +08:00 · 1988 次点击
    这是一个创建于 971 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学,有个疑惑的地方,例如

    file, err := os.Open("/path/to/file.txt")
    scanner := bufio.NewScanner(file)
    

    这里 file 获传入 bufio.NewScanner ,但是文档写的是

    func Open(name string) (*File, error)
    func NewScanner(r io.Reader) *Scanner
    

    这里接受的是参数是 r io.Reader ,为何 file 可以传过去,是否是因为 file 实现了接口导致的,我在文档里面也没有看到有提及,如果是这样在哪里可以看到哪些参数实现了哪些接口呢,不能要用的时候一个个去断言吧?

    6 条回复    2022-04-22 20:41:47 +08:00
    gamexg
        1
    gamexg  
       2022-04-21 21:33:11 +08:00
    的确是因为 file 实现了 io.Reader 接口导致的。
    这是 golang 的特点,不需要明确声明支持某个接口,只要函数名和参数类型一致,就可以认为实现了对应的接口。

    https://tour.go-zh.org/methods/10
    Elaina
        2
    Elaina  
       2022-04-21 22:13:17 +08:00
    golang 的接口是 duck type ,只要实现了某个接口的所有方法就是实现了某个接口,用 Goland 跳转到源码,或者直接查 API 文档查看吧,目前貌似没有什么方便的方法一键查看。
    janxin
        3
    janxin  
       2022-04-21 22:37:02 +08:00 via iPhone
    是实现了接口,所以才可以传进去。背景知识可以先了解一下什么是鸭子类型。

    首先你自己要清楚你想要干什么。判断有一个简单的办法是你有变量 abc 你试一试就知道了,一般 lsp 或者 ide 自动提示你是否满足接口。当然如果你如果只是单纯想找不同的实现,那估计是没地方了。不过后面这种情况没什么实际应用场景,大多是学习场景。
    sozengtao
        4
    sozengtao  
       2022-04-22 08:41:00 +08:00
    官方有一个词用的很准确:satisfy .


    File type satisfy the io.Reader interface .
    tianyou666shen
        5
    tianyou666shen  
       2022-04-22 13:43:28 +08:00
    //io.go
    type Reader interface {
    Read(p []byte) (n int, err error)
    }
    goland 可以点击左侧绿色圈 找到 Reader 的所有实现
    sardina
        6
    sardina  
       2022-04-22 20:41:47 +08:00 via iPhone
    io.Reader 是个接口
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3288 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 11:38 · PVG 19:38 · LAX 03:38 · JFK 06:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.