Hi,大家好,我是明哥,
在自己學習 Golang 的這段時間里,我寫了詳細的學習筆記放在我的個人微信公眾號 《Go編程時光》,對于 Go 語言,我也算是個初學者,因此寫的東西應該會比較適合剛接觸的同學,如果你也是剛學習 Go 語言,不防關注一下,一起學習,一起成長,
我的在線博客:http://golang.iswbm.com
我的 Github:github.com/iswbm/GolangCodingTime
說到Go語言,很多沒接觸過它的人,對它的第一印象,一定是它從語言層面天生支持并發,非常方便,讓開發者能快速寫出高性能且易于理解的程式,
在 Python (為Py為例,主要是我比較熟悉,其他主流編程語言也類似)中,并發編程的門檻并不低,你要學習多行程,多執行緒,還要掌握各種支持并發的庫 asyncio,aiohttp 等,同時你還要清楚它們之間的區別及優缺點,懂得在不同的場景選擇不同的并發模式,
而 Golang 作為一門現代化的編程語言,它不需要你直面這些復雜的問題,在 Golang 里,你不需要學習如何創建行程池/執行緒池,也不需要知道什么情況下使用多執行緒,什么時候使用多行程,因為你沒得選,也不需要選,它原生提供的 goroutine (也即協程)已經足夠優秀,能夠自動幫你處理好所有的事情,而你要做的只是執行它,就這么簡單,
一個 goroutine 本身就是一個函式,當你直接呼叫時,它就是一個普通函式,如果你在呼叫前加一個關鍵字 go ,那你就開啟了一個 goroutine,
// 執行一個函式
func()
// 開啟一個協程執行這個函式
go func()
1. 協程的初步使用
一個 Go 程式的入口通常是 main 函式,程式啟動后,main 函式最先運行,我們稱之為 main goroutine,
在 main 中或者其下呼叫的代碼中才可以使用 go + func() 的方法來啟動協程,
main 的地位相當于主執行緒,當 main 函式執行完成后,這個執行緒也就終結了,其下的運行著的所有協程也不管代碼是不是還在跑,也得乖乖退出,
因此如下這段代碼運行完,只會輸出 hello, world ,而不會輸出hello, go(因為協程的創建需要時間,當 hello, world列印后,協程還沒來得及并執行)
import "fmt"
func mytest() {
fmt.Println("hello, go")
}
func main() {
// 啟動一個協程
go mytest()
fmt.Println("hello, world")
}
對于剛學習Go的協程同學來說,可以使用 time.Sleep 來使 main 阻塞,使其他協程能夠有機會運行完全,但你要注意的是,這并不是推薦的方式(后續我們會學習其他更優雅的方式),
當我在代碼中加入一行 time.Sleep 輸出就符合預期了,
import (
"fmt"
"time"
)
func mytest() {
fmt.Println("hello, go")
}
func main() {
go mytest()
fmt.Println("hello, world")
time.Sleep(time.Second)
}
輸出如下
hello, world
hello, go
2. 多個協程的效果
為了讓你看到并發的效果,這里舉個最簡單的例子
import (
"fmt"
"time"
)
func mygo(name string) {
for i := 0; i < 10; i++ {
fmt.Printf("In goroutine %s\n", name)
// 為了避免第一個協程執行過快,觀察不到并發的效果,加個休眠
time.Sleep(10 * time.Millisecond)
}
}
func main() {
go mygo("協程1號") // 第一個協程
go mygo("協程2號") // 第二個協程
time.Sleep(time.Second)
}
輸出如下,可以觀察到兩個協程就如兩個執行緒一樣,并發執行
In goroutine 協程2號
In goroutine 協程1號
In goroutine 協程1號
In goroutine 協程2號
In goroutine 協程2號
In goroutine 協程1號
In goroutine 協程1號
In goroutine 協程2號
In goroutine 協程1號
In goroutine 協程2號
In goroutine 協程1號
In goroutine 協程2號
In goroutine 協程1號
In goroutine 協程2號
In goroutine 協程1號
In goroutine 協程2號
In goroutine 協程1號
In goroutine 協程2號
In goroutine 協程1號
In goroutine 協程2號
通過以上簡單的例子,是不是折服于Go的這種強大的并發特性,將同步代碼轉為異步代碼,真的只要一個關鍵字就可以了,也不需要使用其他庫,簡單方便,
本篇只介紹了協程的簡單使用,真正的并發程式還是要結合 信道 (channel)來實作,關于信道的內容,將在下一篇文章中介紹,
系列導讀
01. 開發環境的搭建(Goland & VS Code)
02. 學習五種變數創建的方法
03. 詳解資料型別:****整形與浮點型
04. 詳解資料型別:byte、rune與string
05. 詳解資料型別:陣列與切片
06. 詳解資料型別:字典與布爾型別
07. 詳解資料型別:指標
08. 面向物件編程:結構體與繼承
09. 一篇文章理解 Go 里的函式
10. Go語言流程控制:if-else 條件陳述句
11. Go語言流程控制:switch-case 選擇陳述句
12. Go語言流程控制:for 回圈陳述句
13. Go語言流程控制:goto 無條件跳轉
14. Go語言流程控制:defer 延遲呼叫
15. 面向物件編程:介面與多型
16. 關鍵字:make 和 new 的區別?
17. 一篇文章理解 Go 里的陳述句塊與作用域
18. 學習 Go 協程:goroutine
19. 學習 Go 協程:詳解信道/通道
20. 幾個信道死鎖經典錯誤案例詳解
21. 學習 Go 協程:WaitGroup
22. 學習 Go 協程:互斥鎖和讀寫鎖
23. Go 里的例外處理:panic 和 recover
24. 超詳細解讀 Go Modules 前世今生及入門使用
25. Go 語言中關于包匯入必學的 8 個知識點
26. 如何開源自己寫的模塊給別人用?
27. 說說 Go 語言中的型別斷言?
28. 這五點帶你理解Go語言的select用法

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/6559.html
標籤:Go
上一篇:[Go] 自定義一些http Server的引數 用到了interface的一些特性
下一篇:go http庫 設定代理
