func copyConn(dst io.Writer, src io.Reader, errChan chan error) {
_, err := io.Copy(dst, src)
errChan <- err
}
这里我有三个问题想问下:
io.Copy(dst, src)
的作用是什么?io.Reader
和io.Writer
有什么用呢?errChan <- err
这里的这句话是什么意思?
func copyConn(dst io.Writer, src io.Reader, errChan chan error) {
_, err := io.Copy(dst, src)
errChan <- err
}
这里我有三个问题想问下:
io.Copy(dst, src)
的作用是什么?io.Reader
和 io.Writer
有什么用呢?errChan <- err
这里的这句话是什么意思?7 回答5.3k 阅读
6 回答6.9k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答2k 阅读✓ 已解决
1 回答3.4k 阅读
2 回答2.2k 阅读
1 回答2.1k 阅读
调整一下问题顺序
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传输文件的功能,
服务端只需这样写就行了
客户端这样写
io.Copy
如果传入参数不用interface, 因为参数类型不同, 从文件拷贝到tcp,从tcp到文件这2个功能必须写2个函数, 而用了interface这个抽象, 就可以一个函数同时实现2个功能.errChan <- err 这里的这句话是什么意思?
如果调用这个函数的时候开了一个协程,
go copyConn()
, 那么调用方是通过return是收不到返回值的, 所以通过一个channel获取他的返回值.