Golang學習筆記

2021-07-15 19:00:46 字數 1996 閱讀 2044

如果乙個method的receiver是*t,你可以在乙個t型別的例項變數v上面呼叫這個method,而不需要&v去呼叫這個method(即不需要(&v).method())。

如果乙個method的receiver是t,你可以在乙個*t型別的變數p上呼叫這個method,而不需要*p去呼叫這個method。

inte***ce型別定義了一組方法,如果某個物件實現了某個介面的所有方法,則此物件就實現了此介面。

任意的型別都實現了空inte***ce(inte***ce{}),也就是包含0個method的inte***ce。

如果定義了乙個inte***ce的變數,那麼這個變數裡面可以存實現這個inte***ce的任意型別的物件。

inte***ce就是一組抽象方法的集合,它必須由其他非inte***ce型別實現,而不能自我實現。

空inte***ce(inte***ce{})不包含任何的method,正因為如此,所有的型別都實現了空inte***ce。空inte***ce對於描述起不到任何的作用(因為它不包含任何的method),但是空inte***ce在需要儲存任意型別的數值的時候相當有用,因為它可以儲存任意型別的數值。

乙個函式使用inte***ce{}作為引數,那麼它可以接受任意型別的值作為引數,如果乙個函式返回inte***ce{},那麼也就可以返回任意型別的值。

type

stringer inte***ce

如果需要某個型別能被fmt包以特殊的格式輸出,你就必須實現stringer介面。

實現了error介面的物件(即實現了error() string方法的物件),使用fmt輸出時,會呼叫error()方法,因此不必再定義string()方法了。

go語言實現了反射,所謂反射就是能檢查程式在執行時的狀態。

使用reflect一般分成三步:要去反射是乙個型別的值(這些值都實現了空inte***ce),首先需要把它轉化成reflect物件(reflect.type或者reflect.value,根據不同的情況呼叫不同的函式)。

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

goroutine執行在相同的位址空間,因此訪問共享記憶體必須做好同步。那麼goroutine之間如何進行資料的通訊呢,go提供了乙個很好的通訊機制channel。channel可以與unix shell 中的雙向管道做模擬:可以通過它傳送或者接收值。這些值只能是特定的型別:channel型別。定義乙個channel時,也需要定義傳送到channel的值的型別。注意,必須使用make 建立channel:

ci := make(chan

int)

cs := make(chan

string)

cf := make(chan

inte***ce{})

channel通過操作符<-來接收和傳送資料。

ch <- value

// 將value傳送到channel

value := <- ch // 從ch中接收資料,並賦值給value

預設的channel是非快取型別的、阻塞的。

當存在多個channel時,go裡面提供了乙個關鍵字select,通過select可以監聽channel上的資料流動。select預設是阻塞的,只有當監聽的channel中有傳送或接收可以進行時才會執行,當多個channel都準備好的時候,select是隨機的選擇乙個執行的。在select裡面還有default語法,select其實就是類似switch的功能,default就是當監聽的channel都沒有準備好的時候,預設執行的(select不再阻塞等待channel)。

golang學習筆記

與c語法不同之處 1.引數列表中各個引數型別相同時可以只寫出最後乙個,如 add x,y int int 2.型別在引數名 變數 函式 後面 3.函式的左大括號要跟函式名同一行,否則編譯不過 4.函式定義要先寫關鍵字func在函式開頭 函式外的每個語句都要以func var等等關鍵字開頭 5.在包或...

Golang學習筆記

package main import fmt func main break default func inte ce select case defer gomap struct chan else goto package switch const fallthrough ifrange ty...

golang學習筆記

io.reader 提供了reader方法的都是reader io.reader只是inte ce,如file類就是乙個reader type定義類,具體類的方法不用在類中宣告 方法的指標傳遞,是修改內部屬性用,如果是值傳遞則不會修改物件內部屬性 其次指標傳遞減少copy duck typing,沒...