Skip to content

acomagu/bufpipe

Folders and files

NameName
Last commit message
Last commit date

Latest commit

7d0e886 · Mar 12, 2023

History

26 Commits
Mar 12, 2023
Sep 15, 2019
Sep 15, 2019
Mar 12, 2023
Jun 4, 2021
Jun 18, 2019
May 10, 2021
Jun 18, 2019
Jun 18, 2019
Jun 18, 2019

Repository files navigation

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

Contribution

Generate CREDITS

The CREDITS file are generated by gocredits. Update it when the dependencies are changed.

$ gocredits > CREDITS