Skip to content

Instantly share code, notes, and snippets.

@dillonstreator
Last active August 17, 2023 16:20
Show Gist options
  • Save dillonstreator/40f510e0d304bc81489bce105f4ec719 to your computer and use it in GitHub Desktop.
Save dillonstreator/40f510e0d304bc81489bce105f4ec719 to your computer and use it in GitHub Desktop.
Golang one `io.Reader` into multiple `io.Reader` consumers
package main

import (
	"bytes"
	"errors"
	"fmt"
	"io"
	"log"

	"golang.org/x/sync/errgroup"
)

func main() {

	r := bytes.NewReader([]byte("hello world"))

	pr1, pw1 := io.Pipe()
	pr2, pw2 := io.Pipe()

	eg := errgroup.Group{}

	eg.Go(func() error {
		return upload1(pr1)
	})
	eg.Go(func() error {
		return upload2(pr2)
	})

	_, err := io.Copy(io.MultiWriter(pw1, pw2), r)
	err = errors.Join(err, pw1.CloseWithError(err), pw2.CloseWithError(err))
	if err != nil {
		log.Fatal(err)
	}

	err = eg.Wait()
	if err != nil {
		log.Fatal(err)
	}
}

func upload1(r io.Reader) error {
	b, err := io.ReadAll(r)
	if err != nil {
		return err
	}
	fmt.Println(string(b))
	return nil
}
func upload2(r io.Reader) error {
	b, err := io.ReadAll(r)
	if err != nil {
		return err
	}
	fmt.Println(string(b))
	return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment