Skip to content

Instantly share code, notes, and snippets.

@armando-couto
Created March 7, 2022 00:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save armando-couto/1fc5164dcc1020f869d6c73f12fa2c4e to your computer and use it in GitHub Desktop.
Save armando-couto/1fc5164dcc1020f869d6c73f12fa2c4e to your computer and use it in GitHub Desktop.
So let’s put all this to use. Let’s look at an example that uses the done channel pattern, and see what benefits we might gain from switching to use of the context package. Here is a program that concurrently prints a greeting and a farewell
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
done := make(chan interface{})
defer close(done)
wg.Add(1)
go func() {
defer wg.Done()
if err := printGreeting(done); err != nil {
fmt.Printf("%v", err)
return
}
}()
wg.Add(1)
go func() {
defer wg.Done()
if err := printFarewell(done); err != nil {
fmt.Printf("%v", err)
return
}
}()
wg.Wait()
}
func printGreeting(done <-chan interface{}) error {
greeting, err := genGreeting(done)
if err != nil {
return err
}
fmt.Printf("%s world!\n", greeting)
return nil
}
func printFarewell(done <-chan interface{}) error {
farewell, err := genFarewell(done)
if err != nil {
return err
}
fmt.Printf("%s world!\n", farewell)
return nil
}
func genGreeting(done <-chan interface{}) (string, error) {
switch locale, err := locale(done); {
case err != nil:
return "", err
case locale == "EN/US":
return "hello", nil
}
return "", fmt.Errorf("unsupported locale")
}
func genFarewell(done <-chan interface{}) (string, error) {
switch locale, err := locale(done); {
case err != nil:
return "", err
case locale == "EN/US":
return "goodbye", nil
}
return "", fmt.Errorf("unsupported locale")
}
func locale(done <-chan interface{}) (string, error) {
select {
case <-done:
return "", fmt.Errorf("canceled")
case <-time.After(1 * time.Minute):
}
return "EN/US", nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment