Go語言初探

2021-10-02 05:42:42 字數 2010 閱讀 1388

大寫字母開頭變數為共有變數,小寫字母開頭為私有變數(函式類似)

iota列舉(預設開始值為0,const中每增加一行,值加1)

引用型別(類似於動態陣列),相比於array,它沒有長度限制

由於可隨意跳轉,在龐大的系統中不利於debug,所以在coding中會通過結構化程式設計來規避這類問題,那麼,在go語言設計者為何會繼續沿用goto呢?

package main

import "fmt"

func test_goto()

}()for sum := 0; sum < 15; sum++

fmt.println(sum) }}

func main()

輸出結果為:01

2345

6789

1011

12 is error

over!

如果不使用指標作為receiver,那麼傳遞的是引數的copy,如果修改值,只會作用在copy上

golang本身是不支援泛型(通用型別)程式設計的,這也是它被詬病最多的地方,為了彌補這一缺陷,可以通過inte***ce來實現泛型程式設計(ps:go只是暫時不支援,因為這會增加設計的複雜度,以後可能會支援)

go利用reflect實現反射(即檢查程式在執行時的狀態),要去反射是乙個型別的值 (這些值都實現了空 inte***ce),首先需要把它轉化成 reflect 物件 (reflect.type 或者 reflect.value,根據不同的情況呼叫不同的函式)。

要反射的字段必須是可讀寫的字段,否則會報錯。

goroutine 是 go 並行設計的核心。goroutine 說到底其實就是協程,但是它比執行緒更小,十幾個 goroutine 可能體現在底層就是五六個執行緒,go 語言內部幫你實現了這些 goroutine 之間的記憶體共享。執行 goroutine 只需極少的棧記憶體 (大概是 4~5 kb),當然會根據相應的資料伸縮。也正因為如此,可同時執行成千上萬個併發任務。goroutine 比 thread 更易用、更高效、更輕便。

設計上我們要遵循:不要通過共享來通訊,而要通過通訊來共享。

但在 go 1.5 以前排程器僅使用單執行緒,也就是說只實現了併發。想要發揮多核處理器的並行,需要在我們的程式中顯式呼叫 runtime.gomaxprocs (n) 告訴排程器同時使用多個執行緒。gomaxprocs 設定了同時執行邏輯**的系統執行緒的最大數量,並返回之前的設定。如果 n < 1,不會改變當前設定。

channel型別的值可以傳送接收值,注意,必須使用 make 建立 channel。預設情況下,channel 接收和傳送資料都是阻塞的,除非另一端已經準備好,這樣就使得 goroutines 同步變的更加的簡單,而不需要顯式的 lock。所謂阻塞,也就是如果讀取(value := <-ch)它將會被阻塞,直到有資料接收。其次,任何傳送(ch<-5)將會被阻塞,直到資料被讀出。無緩衝 channel 是在多個 goroutine 之間同步很棒的工具。

go 也允許指定 channel 的緩衝大小,很簡單,就是 channel 可以儲存多少元素。ch:= make (chan bool, 4),建立了可以儲存 4 個元素的 bool 型 channel。在這個 channel 中,前 4 個元素可以無阻塞的寫入。當寫入第 5 個元素時,**將會阻塞,直到其他 goroutine 從 channel 中讀取一些元素,騰出空間。

select可以監聽channel上的資料流動。select預設是阻塞的,只有當監聽的 channel 中有傳送或接收可以進行時才會執行,當多個 channel 都準備好的時候,select 是隨機的選擇乙個執行的。

select
select其實就是類似 switch 的功能,default 就是當監聽的 channel 都沒有準備好的時候,預設執行的(select 不再阻塞等待 channel)。

我們可以使用select來設定超時以避免goroutine阻塞導致的整個程式阻塞。

func main() 

}}()

<- o

}

GO語言初探

學習參考 學習go語言 q1.0 for loop 1.建立乙個基於 for 的簡單的迴圈。使其迴圈 10 次,並且使用 fmt 包列印出計數 器的值。package main func main 用 goto 改寫 1 的迴圈。關鍵字 for 不可使用。package main func main...

go語言初探 三

說真的看到go的語法後,我還有點不習慣,感覺它的語法規則很奇怪。但或許就是這樣的語法規則讓它的執行速度變快?這也未可知。在go裡有變數和常量,但沒有列舉。列舉可以用關鍵字const去模擬。常量只能是布林型 數字型 整數型 浮點型和複數 和字串型。編譯器可以根據變數的值來判斷型別。go裡面宣告變數的方...

go語言初探 四

運算子不細講,和c 差不多,注意優先順序就行了,不過我喜歡加括號。控制語句 在switch case 語句中 可以不用寫break,別問,問就是自帶。還多了fallthrough 可以強行執行後面的case語句。即 從第乙個判斷表示式為 true 的 case 開始執行,如果 case 帶有 fal...