要论go最津津乐道的功能莫过于go强大而简洁的并发能力。
- func main(){
- go func(){
- fmt.Println("Hello World")
- }()
- }
通过简单的go func(){},go可以快速生成新的协程并运行。
有并发的地方就有江湖。每个编程语言都有各自的并发编程方式,也有不同的并发控制方法,比如java通过join()来做主子线程同步。
go里面常用于协程间通信和管理的有channel和sync包。比如channel可以通知协程做特定操作(退出,阻塞等),sync可以加锁和同步。
假如我要实现一个可以同时关闭所有协程的程序,可以这样实现。
- closed := make(chan struct{})
-
- for i := 0; i < 2; i++ {
- // do something
-
- go func(i int) {
- select {
- case <-closed:
- fmt.Printf("%d Closed\n", i)
- }
- }(i)
- }
-
- // 发送指令关闭所有协程
- close(closed)
-
- time.Sleep(1 * time.Second)
因为go的协程不支持直接从外部退出,不像C++和Java有个线程ID可以操作。所以只能通过协程自己退出的方式。一般来说通过channel来控制是最方便的。
如果我想加