Created
March 7, 2022 00:19
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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