我想让 Reader.Read 与频道通信同时进行。所以我做了两种方法来运行它
1:
type ReturnRead struct {
n int
err error
}
type ReadGoSt struct {
Returnc <-chan ReturnRead
Nextc chan struct{}
}
func (st *ReadGoSt) Close() {
defer func() {
recover()
}()
close(st.Next)
}
func ReadGo(r io.Reader, b []byte) *ReadGoSt {
returnc := make(chan ReturnRead)
nextc := make(chan bool)
go func() {
for range nextc {
n, err := r.Read(b)
returnc <- ReturnRead{n, err}
if err != nil {
return
}
}
}()
return &ReadGoSt{returnc, nextc}
}
阿拉伯数字:
func ReadGo(r io.Reader, b []byte) <-chan ReturnRead {
returnc := make(chan ReturnRead)
go func() {
n, err := r.Read(b)
returnc <- ReturnRead{n, err}
}()
return returnc
}
我认为代码 2 会产生太多开销
哪个代码更好?1?2?
代码 1 更好,可能更快。代码 2 只会读取一次。但我认为这两种解决方案都不是最好的。您应该遍历读取并仅发回读取的字节。
像这样的东西:http://play.golang.org/p/zRPXOtdgWD