Go語言是在語言層級上支持併發編程的,也就是原生編程,其餘的編程語言實際併發編程須要借一些擴展庫,而Go語言不須要。編程
傳統的併發編程模型,即多線程併發模型,不一樣的線程之間經過共享內存來達到線程通訊的目的。bash
而Go語言雖然也支持經過鎖的模式來實現傳統併發模型,但在Go語言中,更強大仍是對CSP(順序通訊進程)併發模型的支持。多線程
在Go語言併發開發,最重要一句話是:併發
不要經過共享內存實現通訊,而要經過通訊實現內存共享編程語言
Go的併發編程模型只有兩個概念:goroutine(協程)和channel(通道)。函數
若是你有其餘編程語言併發開發的經驗,能夠先把goroutine理解爲線程,固然goroutine和線程仍是有本質上差異的。ui
而channel則是不一樣gorouine通訊的通道。spa
Go語言程序運行時,入口main函數所在的goroutine叫main goroutine。線程
在Go語言中,使用關鍵詞go即可以輕鬆建立一個goroutine,開啓併發編程。code
package main
import "fmt"
func main(){
go test()
fmt.Println("goroutine test1")
}
func test(){
.Println("goroutine test2")
}
複製代碼
在上面的示例中,咱們可能會看到test()函數中的輸出,這是主函數退出時,全部goroutine都會退出執行。
package main
import "fmt"
import "time"
func main(){
go test()
fmt.Println("goroutine test1")
time.Sleep(time.Second)
}
func test(){
.Println("goroutine test2")
}
複製代碼
經過time.Sleep()函數,使用主函數在一秒鐘後退出,咱們能夠看到test()函數所在的gotoutine也會執行。