Go學習日記10

1.runtime.GOMAXPROCS
解析:
[1]Go語言中可以通過runtime.GOMAXPROCS()函數設置當前程序併發時佔用的CPU邏輯核心數。
[2]Go運行時的調度器使用GOMAXPROCS參數來確定需要使用多少個OS線程來同時執行Go代碼。默認值是機器上的CPU核心數。

2.Go中的操作系統線程和goroutine的關係
解析:
[1]一個操作系統線程對應用戶態多個goroutine。
[2]go程序可以同時使用多個操作系統線程。
[3]goroutine和OS線程是多對多的關係,即m:n。

3.channel
解析:如果說goroutine是Go程序併發的執行體,channel就是它們之間的連接。channel是可以讓一個goroutine發送特定值到另一個goroutine的通信機制。

4.創建channel
解析:通道是引用類型,通道類型的空值是nil。聲明的通道後需要使用make函數初始化之後才能使用。

var 變量 chan 元素類型
make(chan 元素類型, [緩衝大小])

5.channel操作
解析:通道有發送、接收和關閉三種操作。如下所示:

ch <- 10 // 把10發送到ch中
x := <- ch // 從ch中接收值並賦值給變量x
close(ch)

6.關閉後的通道特點
解析:
[1]對一個關閉的通道再發送值就會導致panic。
[2]對一個關閉的通道進行接收會一直獲取值直到通道爲空。
[3]對一個關閉的並且沒有值的通道執行接收操作會得到對應類型的零值。
[4]關閉一個已經關閉的通道會導致panic。

7.無緩衝通道
解析:
[1]無緩衝的通道只有在有人接收值的時候才能發送值。
[2]使用無緩衝通道進行通信將導致發送和接收的goroutine同步化。因此,無緩衝通道也被稱爲同步通道。
[3]無緩衝通道上的發送操作會阻塞,直到另一個goroutine在該通道上執行接收操作,這時值才能發送成功,兩個goroutine將繼續執行。相反,如果接收操作先執行,接收方的goroutine將阻塞,直到另一個goroutine在該通道上發送一個值。

8.單向通道
解析:
[1]chan<- int是一個只能發送的通道,可以發送但是不能接收
[2]<-chan int是一個只能接收的通道,可以接收但是不能發送
說明:關閉已經關閉的channel也會引發panic。

9.select
解析:在某些場景下需要同時從多個通道接收數據。通道在接收數據時,如果沒有數據可以接收將會發生阻塞。爲了應對這種場景,Go內置了select關鍵字,可以同時響應多個通道的操作。如下所示:

select {
    case <-chan1:
       // 如果chan1成功讀到數據,則進行該case處理語句
    case chan2 <- 1:
       // 如果成功向chan2寫入數據,則進行該case處理語句
    default:
       // 如果上面都沒有成功,則進入default處理流程
}

select的使用類似於switch語句,它有一系列case分支和一個默認的分支。每個case會對應一個通道的通信[接收或發送]過程。select會一直等待,直到某個case的通信操作完成時,就會執行case分支對應的語句。

10.WaitGroup對象
解析:WaitGroup對象內部有一個計數器,最初從0開始,它有三個方法:Add(),Done(),Wait()用來控制計數器的數量。Add(n)把計數器設置爲n,Done()每次把計數器-1,wait()會阻塞代碼的運行,直到計數器地值減爲0。

func main() {
    wg := sync.WaitGroup{}
    wg.Add(100)
    for i := 0; i < 100; i++ {
        go func(i int) {
            fmt.Println(i)
            wg.Done()
        }(i)
    }
    wg.Wait()
}

這裏首先把wg計數設置爲100,每個for循環運行完畢都把計數器減一,主函數中使用Wait()一直阻塞,直到wg爲0,即所有100個for循環都運行完畢。
說明:WaitGroup對象不是一個引用類型,在通過函數傳值的時候需要使用地址。

11.互斥鎖和讀寫鎖
解析:
[1]互斥鎖是一種常用的控制共享資源訪問的方法,它能夠保證同時只有一個goroutine可以訪問共享資源。Go語言中使用sync包的Mutex類型來實現互斥鎖。
[2]讀寫鎖分爲兩種:讀鎖和寫鎖。當一個goroutine獲取讀鎖之後,其他的goroutine如果是獲取讀鎖會繼續獲得鎖,如果是獲取寫鎖就會等待;當一個goroutine獲取寫鎖之後,其他的goroutine無論是獲取讀鎖還是寫鎖都會等待。

12.html/template
解析:template包[html/template]實現了數據驅動的模板,用於生成可對抗代碼注入的安全HTML輸出。本包提供了和text/template包相同的接口,無論何時當輸出是HTML的時候都應使用本包。

13.Go模板引擎工作方式
解析:Go模板引擎的工作方式就是對一個模板進行語法分析,接着在執行這個模板的時候,將一個ResponseWriter以及一些數據傳遞給它。被調用的模板引擎會對傳入的已分析模板以及數據進行合併,然後把合併的結果傳遞給ResponseWriter。

14.gob包
解析:encoding/gob包用於管理由gob組成的流,這是一種在編碼器和解碼器之間進行交換的二進制數據,這種數據原本是爲序列化以及數據傳輸而設計的,但它也可以用於對數據進行持久化,並且爲了讓用戶能夠方便地對文件進行讀寫,編碼器和解碼器一般都會分別包裹起程序的寫入器以及讀取器。

15.sync包
解析:sync包提供了基本的同步基元,如互斥鎖。除了Once和WaitGroup類型,大部分都是適用於低水平程序線程,高水平的同步使用channel通信更好一些。

16.MySQL Workbench
解析:MySQL Workbench是爲MySQL設計的ER/數據庫建模工具。是著名的數據庫設計工具DBDesigner4的繼任者。具有設計和創建新的數據庫圖示,建立數據庫文檔,以及進行復雜的MySQL 遷移的作用。

17.bufio包
解析:bufio包實現了有緩衝的I/O。它包裝一個io.Reader或io.Writer接口對象,創建另一個也實現了該接口,且同時還提供了緩衝和一些文本I/O的幫助函數的對象。

18.suffixarrayb包
解析:suffixarrayb包通過使用內存中的後綴樹實現了對數級時間消耗的子字符串搜索。

19.strconv包
解析:strconv包實現了基本數據類型和其字符串表示的相互轉換。

20.unsafe包
解析:unsafe包提供了一些跳過go語言類型安全限制的操作。

21.appengine包
解析:appengine包提供Google App Engine的基本函數服務。

參考文獻:
[1]Golang sync.WaitGroup的用法:https://studygolang.com/articles/12972?fr=sidebar
[2]如何使用docker部署一個beego項目:https://hacpai.com/article/1526210600840

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章