这是goroutine开销的一个更好的代码



我想让 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

相关内容

  • 没有找到相关文章

最新更新