diff --git a/oreilly/goroute b/oreilly/goroute new file mode 100755 index 0000000..e72ee59 Binary files /dev/null and b/oreilly/goroute differ diff --git a/oreilly/main.go b/oreilly/main.go index 7eb0fc0..399dadd 100644 --- a/oreilly/main.go +++ b/oreilly/main.go @@ -2,86 +2,50 @@ package main import ( "fmt" - "sort" + "os" + "strconv" + "sync" ) -type Player struct { - name string -} - -type Team struct { - Name string - Members []Player -} - -type League struct { - Wins map[string]int -} - -type Ranker interface { - Ranking () []string -} - -func (l League) MatchResult(ft, st string, fscore, sscore int) { - l.Wins[ft] += fscore - l.Wins[st] += sscore -} - -func (l League) Ranking() []string { - for k, v := range l.Wins { - fmt.Printf("Command %s has %d scores\n", k, v) +func go1(ch chan<- string, wg1 *sync.WaitGroup) { + defer wg1.Done() + for i := 1; i < 11; i++ { + ch <- "go1_" + strconv.Itoa(i) } - keys := make([]string, 0, len(l.Wins)) - for k := range l.Wins { - keys = append(keys, k) +} + +func go2(ch chan<- string, wg1 *sync.WaitGroup) { + defer wg1.Done() + for i := 1; i < 11; i++ { + ch <- "go2_" + strconv.Itoa(i) } +} - sort.Slice(keys, func(i, j int) bool { - return l.Wins[keys[i]] > l.Wins[keys[j]] - }) - - for _, k := range keys { - fmt.Println(k, l.Wins[k]) +func Reader(ch <-chan string, wg *sync.WaitGroup) { + defer wg.Done() + for { + if v, ok := <-ch; !ok { + fmt.Println("Channel closed") + os.Exit(1) + } else { + fmt.Println(v) + } } - - return keys } func main() { - Spartak := Team{ - Name: "Spartak", - Members: []Player{ - {name: "Titov"}, - {name: "Dzuba"}, - }, - } - - Dinamo := Team{ - Name: "Dinamo", - Members: []Player{ - {name: "Ivanov"}, - {name: "Petrov"}, - }, - } - - Torpedo := Team{ - Name: "Torpedo", - Members: []Player{ - {name: "Sidorov"}, - {name: "Zalupkin"}, - }, - } - - league := League{ - Wins: make(map[string]int), - } - - league.MatchResult(Spartak.Name, Dinamo.Name, 2, 4) - league.MatchResult(Torpedo.Name, Dinamo.Name, 3, 3) - league.MatchResult(Spartak.Name, Torpedo.Name, 1, 2) - - fmt.Println(league) - - fmt.Println(league.Ranking()) + var wg1 sync.WaitGroup + var wg sync.WaitGroup + wg.Add(1) + wg1.Add(2) + ch := make(chan string) + go go1(ch, &wg1) + go go2(ch, &wg1) + go Reader(ch, &wg) + go func() { + wg1.Wait() + close(ch) + }() + wg.Wait() }