package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup //一個沒有緩衝區的chan ch := make(chan string) wg.Add(3) go sendData(ch, &wg) go getData(ch, &wg) go getData2(ch, &wg) // 等待全部的goroutine都執行完成後才關閉主線程 time.Sleep(time.Second*3) wg.Wait() fmt.Printf("main goroutine exited\n") } // 若是定義的不是全局的wait group,則在傳值的時候須要傳指針類型 func sendData(ch chan string, waitGroup *sync.WaitGroup) { ch <- "aaa" ch <- "bbb" ch <- "ccc" ch <- "ddd" ch <- "eee" // 關閉chan,即便使用了 waitGroup也須要關閉channel // waitGroup只是用於主線程等待goroutine執行完畢 // channel是一個隊列,用於多個goroutine的通信 close(ch) fmt.Printf("send data exited") // 使用 waitGroup給出goroutine的結束信號 waitGroup.Done() } // func getData(ch chan string, waitGroup *sync.WaitGroup) { for { input, ok := <-ch if !ok { break } fmt.Printf("getData中的input值: %s\n", input) } fmt.Printf("get data exited\n") // 使用 waitGroup給出goroutine的結束信號 waitGroup.Done() } func getData2(ch chan string, waitGroup *sync.WaitGroup) { for { input2, ok := <-ch if !ok { break } fmt.Printf("getData2中的input值:%s\n", input2) } fmt.Printf("get data2 exited\n") // 使用 waitGroup給出goroutine的結束信號 waitGroup.Done() }