编码习惯&标准库[3.io标准库]
从下面的函数实现,看出来,接收的参数不是io.Writer,就是io.Reader,即接收的是两个基础接口,然后对其传入的参数进行对应的实现调用。
为什么可以这样?这时go的优美设计,通过接口来实现多态。也是“鸭子类型”的特色,通过声明接口,任何的类型实现了对应的接口,就是对应接口的实现了,这样也是实现多态。
所以函数在接收了接口后,若传入的参数类型都有相同的共享,那么就是实现了相同的接口,那么,那么这个函数,比如WriteString,对于这些实现类型都是适用的。
go1.13.7 /Go/src/io/io.go:282
- WriteString(w Writer, s string) (n int, err error)
- ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
- ReadFull(r Reader, buf []byte) (n int, err error)
- CopyN(dst Writer, src Reader, n int64) (written int64, err error)
- Copy(dst Writer, src Reader) (written int64, err error)
- CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)
- copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)
- LimitReader(r Reader, n int64)
平时开发中,运用好接口设计,对于架构的高内聚,低耦合,模块化设计是非常有帮助的。比如在对于共同的响应函数,可以先声明一个handle接口,然后各自的响应事件对象来实现此接口,这样就相当于业务依赖于抽象,而不是依赖具体实现。这也是设计模式中的精髓。