diff --git a/README.md b/README.md index 31e9aca..251237c 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ package main import ( "fmt" + "net/http" + "github.com/pieterclaerhout/go-waitgroup" ) @@ -31,23 +33,69 @@ func main() { wg := waitgroup.NewWaitGroup(3) - for _, url := range urls { - wg.BlockAdd() - go func(url string) { - defer wg.Done() - fmt.Println("%s: checking", url) - res, err := http.Get(url) - if err != nil { - fmt.Println("Error: %v") - } else { - defer res.Body.Close() - fmt.Println("%s: result: %v", err) - } - }(url) - } + for _, url := range urls { + wg.BlockAdd() + go func(url string) { + defer wg.Done() + fmt.Printf("%s: checking\n", url) + res, err := http.Get(url) + if err != nil { + fmt.Println("Error: %v") + } else { + defer res.Body.Close() + fmt.Printf("%s: result: %v\n", url, err) + } + }(url) + } wg.Wait() fmt.Println("Finished") } ``` + +There is also a way to use function closures to make it even more readable: + +```go +package main + +import ( + "fmt" + "net/http" + + "github.com/pieterclaerhout/go-waitgroup" +) + +func main() { + + urls := []string{ + "https://www.easyjet.com/", + "https://www.skyscanner.de/", + "https://www.ryanair.com", + "https://wizzair.com/", + "https://www.swiss.com/", + } + + wg := waitgroup.NewWaitGroup(3) + + for _, url := range urls { + + urlToCheck := url + wg.Add(func() { + fmt.Printf("%s: checking\n", urlToCheck) + res, err := http.Get(urlToCheck) + if err != nil { + fmt.Println("Error: %v") + } else { + defer res.Body.Close() + fmt.Printf("%s: result: %v\n", urlToCheck, err) + } + }) + + } + + wg.Wait() + fmt.Println("Finished") + +} +``` \ No newline at end of file diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 0000000..f516c3c --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,41 @@ +package main + +import ( + "fmt" + "net/http" + + "github.com/pieterclaerhout/go-waitgroup" +) + +func main() { + + urls := []string{ + "https://www.easyjet.com/", + "https://www.skyscanner.de/", + "https://www.ryanair.com", + "https://wizzair.com/", + "https://www.swiss.com/", + } + + wg := waitgroup.NewWaitGroup(3) + + for _, url := range urls { + + urlToCheck := url + wg.Add(func() { + fmt.Printf("%s: checking\n", urlToCheck) + res, err := http.Get(urlToCheck) + if err != nil { + fmt.Println("Error: %v") + } else { + defer res.Body.Close() + fmt.Printf("%s: result: %v\n", urlToCheck, err) + } + }) + + } + + wg.Wait() + fmt.Println("Finished") + +} diff --git a/waitgroup.go b/waitgroup.go index 82075aa..83984e5 100644 --- a/waitgroup.go +++ b/waitgroup.go @@ -26,12 +26,20 @@ func NewWaitGroup(size int) *WaitGroup { return wg } +// Add add the function close to the waitgroup +func (wg *WaitGroup) Add(closure func()) { + wg.BlockAdd() + go func() { + defer wg.Done() + closure() + }() +} + // BlockAdd pushes ‘one’ into the group. Blocks if the group is full. func (wg *WaitGroup) BlockAdd() { if wg.size > 0 { wg.pool <- 1 } - // atomic.AddInt64(&wg.waitCount, 1) wg.waitGroup.Add(1) } @@ -40,7 +48,6 @@ func (wg *WaitGroup) Done() { if wg.size > 0 { <-wg.pool } - // atomic.AddInt64(&wg.waitCount, -1) wg.waitGroup.Done() }