select channel with error handling

This commit is contained in:
jian.han 2018-01-19 16:25:24 +10:00
parent df6196b7a1
commit 93cce988bb
3 changed files with 66 additions and 0 deletions

BIN
concurrency/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -20,6 +20,7 @@ goroutines in some sort of organized fashion.
**/ **/
func main() { func main() {
resourceLeak()
cancellationSignal() cancellationSignal()
} }

View File

@ -0,0 +1,65 @@
package main
import (
"fmt"
"time"
"github.com/davecgh/go-spew/spew"
)
func main() {
if err := selectWithErrorDemo(); err != nil {
spew.Dump(err)
}
time.Sleep(time.Second * 5)
}
func selectWithErrorDemo() error {
// start update race and market
count, errChan, doneChan := 2, make(chan error), make(chan bool)
go func() {
// update race
if err := doFirstThing(); err != nil {
errChan <- err
} else {
doneChan <- true
fmt.Println("Finish First Go Routine")
}
}()
go func() {
// update market
if err := doSecondThing(); err != nil {
errChan <- err
} else {
doneChan <- true
fmt.Println("Finish Second Go Routine")
}
}()
for i := 0; i < count; i++ {
select {
case err := <-errChan:
return err
case d := <-doneChan:
spew.Dump(i, d)
}
}
return nil
}
func doFirstThing() error {
time.Sleep(time.Second * 2)
fmt.Println("Exectue Do First")
return nil
}
func doSecondThing() error {
time.Sleep(time.Second * 1)
fmt.Println("Exectue Do Second")
// return errors.New("Error In Second")
return nil
}