Compare commits

..

No commits in common. "9b57621ecd84f099be41fbfc3fef793871026dd9" and "a2bd8f9c29bb80e05e78f15bbdcc2995687d429a" have entirely different histories.

3 changed files with 27 additions and 43 deletions

View File

@ -8,10 +8,6 @@ simple:
GO111MODULE="off" go build -v -x -o ~/go/bin/simple-worker simple-worker.go GO111MODULE="off" go build -v -x -o ~/go/bin/simple-worker simple-worker.go
simple-worker simple-worker
main1:
GO111MODULE="off" go build -v -x -o ~/go/bin/main1 main.go
main1
return-vals: return-vals:
GO111MODULE="off" go build -v -x -o ~/go/bin/return-vals return-vals.go GO111MODULE="off" go build -v -x -o ~/go/bin/return-vals return-vals.go
return-vals return-vals

View File

@ -12,23 +12,21 @@ func generateNumbers(total int, ch chan<- int, wg *sync.WaitGroup) {
defer wg.Done() defer wg.Done()
for idx := 1; idx <= total; idx++ { for idx := 1; idx <= total; idx++ {
fmt.Printf("START generateNumbers() sending %d to channel\n", idx) fmt.Printf("START sending %d to channel\n", idx)
ch <- idx ch <- idx
// res, err := (<-r)() // res, err := (<-r)()
fmt.Printf("END generateNumbers() sending %d to channel\n", idx) fmt.Printf("END sending %d to channel\n", idx)
} }
wg.Wait() wg.Wait()
fmt.Printf("END generateNumbers() wg sending to channel\n") fmt.Printf("END wg sending to channel\n")
} }
func printInt(idx int, ch <-chan int, wg *sync.WaitGroup) { func printInt(idx int, ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done() defer wg.Done()
fmt.Printf("START printInt() for chan range\n")
for num := range ch { for num := range ch {
fmt.Printf("%d: read %d from channel\n", idx, num) fmt.Printf("%d: read %d from channel\n", idx, num)
} }
fmt.Printf("START printInt() for chan range\n")
} }
func main() { func main() {

View File

@ -4,65 +4,55 @@
package main package main
import ( import (
"log" "fmt"
"sync" "sync"
) )
var wg sync.WaitGroup
var functionChan chan func (*sync.WaitGroup)
type funcWait struct { type funcWait struct {
f func() f func()
wgF sync.WaitGroup wgF sync.WaitGroup
val int
err error err error
res int res int
} }
var functionChan chan *funcWait
var afunc funcWait
var wg sync.WaitGroup
func generateNumbers(total int, ch chan<- *funcWait, af *funcWait) { func generateNumbers(total int, ch chan<- func (), wg *sync.WaitGroup) {
log.Println("generateNumbers() START total =", total)
ch <- af
log.Println("generateNumbers() END total =", total)
}
func andlabsGoroutine(ch <-chan *funcWait, wg *sync.WaitGroup) {
defer wg.Done() defer wg.Done()
log.Println("andlabsGoroutine() START") fmt.Printf("sending %d to channel\n", total)
for f := range ch { ch <- func() {
log.Println("andlabsGoroutine() read f() from channel") fmt.Printf("inside f() sending %d to channel\n", total)
f.f() }
}
func andlabsGoroutine(ch <-chan func(), wg *sync.WaitGroup) {
defer wg.Done()
for f := range ch {
fmt.Printf("read f() from channel\n")
f()
} }
log.Printf("andlabsGoroutine() END")
} }
func main() { func main() {
functionChan = make(chan *funcWait) functionChan = make(chan func(*sync.WaitGroup))
// syntax to get the return values from a channel r := make(chan func() (int, error))
// r := make(chan func() (int, error)) res, err = (<-r)()
// afunc.res, afunc.err = (<-r)()
wg.Add(1) wg.Add(1)
go andlabsGoroutine(functionChan, &wg) go andlabsGoroutine(functionChan, &wg)
// afunc.wgF = wg for idx := 1; idx <= total; idx++ {
afunc.f = func() { generateNumbers(idx, functionChan, &wg)
log.Println("\tGOT INSIDE: running f() from inside the structure & inside the wait group goroutine", afunc.val)
} }
for idx := 1; idx <= 10; idx++ {
afunc.val = idx * 20
generateNumbers(idx, functionChan, &afunc)
}
wg.Done()
close(functionChan) close(functionChan)
// close(wg)
log.Println("Waiting for goroutines to finish...") fmt.Println("Waiting for goroutines to finish...")
wg.Wait() wg.Wait()
log.Println("Done!") fmt.Println("Done!")
} }