直接上code
package main | |
import ("fmt""sync" | |
) | |
func func3(wg *sync.WaitGroup, ch chan string) { | |
ch <- "func1 ok" | |
wg.Done() | |
} | |
func func4(wg *sync.WaitGroup, ch chan string) { | |
ch <- "func2 ok" | |
wg.Done() | |
} | |
func SyncCron2(functions ...func(wg *sync.WaitGroup, ch chan string)) []string { | |
chs := make([]chan string, len(functions)) | |
// 关闭 chan | |
defer func() {for _, c := range chs {if c != nil {close(c)}}}() | |
wg := sync.WaitGroup{} | |
wg.Add(len(functions)) | |
for i, f := range functions { | |
chs[i] = make(chan string, 1) | |
go f(&wg, chs[i])} | |
wg.Wait() | |
result := make([]string, len(functions))for i, ch := range chs { | |
result[i] = <-ch | |
} | |
return result | |
} | |
func main() { | |
r := SyncCron2(func3, func4) | |
fmt.Println(r) | |
} |
小细节:
这里如果不使用缓冲通道会报下面的错误:
all goroutines are asleep - deadlock!
详细原理可参考 该文章