logginghandler/vendor/github.com/acomagu/bufpipe
Marvin Preuss d095180eb4
All checks were successful
continuous-integration/drone/push Build is passing
build: uses go modules for tool handling
2022-01-14 13:51:56 +01:00
..
bufpipe.go build: uses go modules for tool handling 2022-01-14 13:51:56 +01:00
doc.go build: uses go modules for tool handling 2022-01-14 13:51:56 +01:00
go.mod build: uses go modules for tool handling 2022-01-14 13:51:56 +01:00
go.sum build: uses go modules for tool handling 2022-01-14 13:51:56 +01:00
README.md build: uses go modules for tool handling 2022-01-14 13:51:56 +01:00

bufpipe: Buffered Pipe

CircleCI GoDoc

The buffered version of io.Pipe. It's safe for concurrent use.

How does it differ from io.Pipe?

Writes never block because the pipe has variable-sized buffer.

r, w := bufpipe.New(nil)
io.WriteString(w, "abc") // No blocking.
io.WriteString(w, "def") // No blocking, too.
w.Close()
io.Copy(os.Stdout, r)
// Output: abcdef

Playground

How does it differ from bytes.Buffer?

Reads block if the internal buffer is empty until the writer is closed.

r, w := bufpipe.New(nil)

done := make(chan struct{})
go func() {
	io.Copy(os.Stdout, r) // The reads block until the writer is closed.
	done <- struct{}{}
}()

io.WriteString(w, "abc")
io.WriteString(w, "def")
w.Close()
<-done
// Output: abcdef

Playground