diff --git a/concurrency/.DS_Store b/concurrency/.DS_Store new file mode 100644 index 0000000..acbcfef Binary files /dev/null and b/concurrency/.DS_Store differ diff --git a/concurrency/goroutine_leak/main.go b/concurrency/goroutine_leak/main.go index ad2e5c4..3109b03 100644 --- a/concurrency/goroutine_leak/main.go +++ b/concurrency/goroutine_leak/main.go @@ -20,6 +20,7 @@ goroutines in some sort of organized fashion. **/ func main() { + resourceLeak() cancellationSignal() } diff --git a/concurrency/select_error_handling/main.go b/concurrency/select_error_handling/main.go new file mode 100644 index 0000000..91c2886 --- /dev/null +++ b/concurrency/select_error_handling/main.go @@ -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 +}