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

时间:2015-01-09 16:47:45

标签: go overhead 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}
}

2:

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 个答案:

答案 0 :(得分:1)

代码1更好,可能更快。代码2只读一次。但我认为这两种解决方案都不是最好的。你应该遍历读取并仅发送回来的字节。

类似于:http://play.golang.org/p/zRPXOtdgWD