go

编码习惯&标准库

1.defer的应用,close文件

Posted by Liangjf on March 30, 2020

编码习惯&标准库[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接口,然后各自的响应事件对象来实现此接口,这样就相当于业务依赖于抽象,而不是依赖具体实现。这也是设计模式中的精髓。