Валентин обнови решението на 12.11.2016 19:22 (преди над 1 година)
+package main
+
+import (
+ "sync"
+)
+
+func ConcurrentRetryExecutor(tasks []func() string, concurrentLimit int, retryLimit int) <-chan struct {
+ index int
+ result string
+} {
+ result := make(chan struct {
+ index int
+ result string
+ })
+ go func() {
+ done := make(chan struct{}, concurrentLimit)
+ var wg sync.WaitGroup
+ for index, value := range tasks {
+ done <- struct{}{}
+ wg.Add(1)
+ go func(index int, fnc func() string) {
+ for i := 0; i < retryLimit; i++ {
+ res := fnc()
+ result <- struct {
+ index int
+ result string
+ }{index, res}
+ if res != "" {
+ break
+ }
+ }
+ <-done
+ wg.Done()
+ }(index, value)
+ }
+ wg.Wait()
+ close(result)
+ }()
+ return result
+}
Не сме преподавали sync.WaitGroup и понеже задачата е напълно решима без тях, само със материала преподаван до сега бих предпочел ако напишеш решение без тях. Иначе решението ти е вярно и нямам забележки освен горната.