errChan <- err 是什么意思?

func copyConn(dst io.Writer, src io.Reader, errChan chan error) {
    _, err := io.Copy(dst, src)
    errChan <- err
}

这里我有三个问题想问下:

  1. io.Copy(dst, src) 的作用是什么?
  2. io.Readerio.Writer 有什么用呢?
  3. errChan <- err 这里的这句话是什么意思?
阅读 1.8k
1 个回答

调整一下问题顺序

1. io.Reader 和 io.Writer 有什么用呢?

io.Reader是一个interface, 比如一个以read模式打开的文件,一个tcp连接这些有Read(p []byte) (n int, err error)方法的都可以认为是io.Reader

io.Writer是一个interface, 比如一个以write模式打开的文件,一个tcp连接这些有Write(p []byte) (n int, err error)方法的都可以认为是io.Writer

io.Copy(dst, src) 的作用是什么?

io.Copy具体做的事情就是不停地调用src的Read方法,从里面读出数据, 然后调用dst的Write方法把读出的数据写进去, 读到eof或者出异常就退出.

比如要做一个从tcp传输文件的功能,
服务端只需这样写就行了

conn := {一个tcp连接}
file := {打开一个文件}
go io.Copy(file,conn)

客户端这样写

conn := {一个tcp连接}
file := {打开一个文件}
go io.Copy(conn,file)

io.Copy如果传入参数不用interface, 因为参数类型不同, 从文件拷贝到tcp,从tcp到文件这2个功能必须写2个函数, 而用了interface这个抽象, 就可以一个函数同时实现2个功能.

errChan <- err 这里的这句话是什么意思?

如果调用这个函数的时候开了一个协程, go copyConn(), 那么调用方是通过return是收不到返回值的, 所以通过一个channel获取他的返回值.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题