本文共34道題目html
此題考查編碼規範。node
反射最多見的使用場景是作對象的序列化(serialization,有時候也叫Marshal & Unmarshal)。python
例如:Go語言標準庫的encoding/json、encoding/xml、encoding/gob、encoding/binary等包就大量依賴於反射功能來實現。golang
構造函數 ,是一種特殊的方法。主要用來在建立對象時初始化對象, 即爲對象成員變量賦初始值,總與new運算符一塊兒使用在建立對象的語句中。特別的一個類能夠有多個構造函數 ,可根據其參數個數的不一樣或參數類型的不一樣來區分它們 即構造函數的重載。json
而golang沒有相關的構造函數定義,只能經過new來建立構造函數。數組
Go語言中的map是無序的組合。瀏覽器
X字段在從結構體實例編碼到JSON數據格式的時候,使用x做爲名字,這能夠看做是一種重命名的方式。安全
go語言的自動內存管理機制使得只要還有一個指針引用一個變量,那這個變量就會在內存中得以保留,所以在Go語言函數內部返回指向本地變量的指針是安全的。app
序列化一般將類型結構傳入標準庫或第三方包,類型結構中沒有大寫的變量未導出,對第三方包不可見,沒法進行任何操做,依舊是默認的零值。框架
指針是引用類型。主要引用對方的地址。
是目錄名。
Cgo是C語言和Go語言之間的橋樑,原則上沒法直接支持C++的類。Cgo不支持C++語法的根本緣由是C++至今爲止尚未一個二進制接口規範(ABI)。Cgo只支持C語言中值類型的數據類型,因此咱們是沒法直接使用C++的引用參數等特性的。
注:Cgo是調用C代碼模塊,靜態庫和動態庫。
golang雖然沒有顯式的提供繼承語法,可是經過匿名組合實現了繼承。
實踐代碼:
package main import "fmt" func main(){ a := func(a,b int,z float64) bool{ return a*b < int(z) } fmt.Print(a(2,3,3)) //false }
匿名函數:由一個不帶函數名的函數聲明和函數體組成,它能夠直接賦值給一個變量或直接執行。
若是有多個defer表達式,調用順序相似於棧,越後面的defer表達式越先被調用。因此先執行fmt再執行if判斷,答案依次輸出「1」和「3」。
Add函數帶入的是b而不是*b,因此只能在AC中選,可是i.(Integer)通過類型斷言之後就是Integer類型了,沒法自動轉成*Integer,因此只能選A了。若是將題目改爲sum := a.Add(b)則能夠選AC。
If f is variadic with a final parameter p of type ...T, then within f the type of p is equivalent to type []T. If f is invoked with no actual arguments for p, the value passed to p is nil. Otherwise, the value passed is a new slice of type []T with a new underlying array whose successive elements are the actual arguments, which all must be assignable to T. The length and capacity of the slice is therefore the number of arguments bound to p and may differ for each call site.
Given the function and calls
func Greeting(prefix string, who ...string)
Greeting("nobody")
Greeting("hello:", "Joe", "Anna", "Eileen")
within Greeting, who will have the value nil in the first call, and []string{"Joe", "Anna", "Eileen"} in the second.
If the final argument is assignable to a slice type []T, it may be passed unchanged as the value for a ...T parameter if the argument is followed by .... In this case no new slice is created.
Given the slice s and call
s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)
within Greeting, who will have the same value as s with the same underlying array.
def是python定義函數的關鍵字,class是類型。
ABC,A爲最完整的寫法,指明瞭變量名,類型,初始值;B是簡寫法,沒有指定變量類型,不過go提供了類型推斷,其會根據初始值推斷類型;C是快速模式,經過":="快速建立一個變量。
實現接口時,不須要提早導入,都是隱式默認的。
Go語言中只有for循環。for後面的語句中不能有逗號分割的語句,各個語句必須都是平等的,使用分號分割。for後面能夠有無數多個分號。
go語言中的++、--操做符都是後置操做符,必須跟在操做數後面,而且它們沒有返回值,因此它們不能用於表達式。
D中add會把數組中元素轉成int值變成多個參數。
一個類實現了一個接口中的全部方法,那麼它就實現了這個類。能夠用這個類的對象來初始化一個接口。經過接口能夠實現多態,相似C++虛函數重載。
Make只用來建立slice,map,channel,其中map使用前必須初始化。append可直接動態擴容slice,而map不行。
map在使用前必須初始化。 var m map[string]int = make(map[string]int) m["one"] = 1 //這樣能夠; var m map[string]int = map[string]int{"two", 2} m["one"] = 1 //這樣也能夠; var m map[string]int m["one"] = 1 //這樣就不行。
main函數和init函數都沒有參數和返回值的定義。
遞歸檢測:go tool vet package1 package2。所以——go tool vet 才能夠遞歸。
本次練習把牛客網最後的34道Go語言練習題所有搞完了。涉及構造函數、GoConvey框架、反射、vet指令、序列化、main函數概念、錯誤設計、init函數、add函數、接口、匿名函數、Cgo、defer表達式等。
不斷迭代,不斷更新,不斷嘗試並不斷進步。
後期將着重學習Go語言的框架和項目實踐學習。