牛客網_Go語言相關練習_判斷&選擇題(6)

本文共34道題目html

1、判斷題

 

此題考查編碼規範。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

 

序列化一般將類型結構傳入標準庫或第三方包,類型結構中沒有大寫的變量未導出,對第三方包不可見,沒法進行任何操做,依舊是默認的零值。框架

 

指針是引用類型。主要引用對方的地址。

 

是目錄名。

 

函數返回失敗有3種狀況:
  1. 第一次分配資源失敗,直接返回,這時並無分配成功的資源;
  2. 第一次分配資源成功,第二次分配資源失敗,函數返回,第二次和第三次的資源都未成功分配,此時err不爲nil,第一次分配成功的資源經過defer釋放;
  3. 第一二次資源分配成功,第三次資源分配失敗,函數返回,第一二次分配成功的資源經過defer釋放;
若是第三次資源分配也成功了,則函數不會返回失敗。
題目問的是deferDemo返回失敗的狀況,遇到資源分配失敗才返回錯誤,當遇到資源分配失敗時,前面已經分配成功的資源會在defer中釋放。最後一次資源分配成功後沒有用defer釋放資源,但題目問的是函數返回失敗的狀況,故返回資源分配失敗錯誤後,已經分配的資源都能釋放。因此正確。
 

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
}

匿名函數:由一個不帶函數名的函數聲明和函數體組成,它能夠直接賦值給一個變量或直接執行

 

2、選擇題

若是有多個defer表達式,調用順序相似於棧,越後面的defer表達式越先被調用。因此先執行fmt再執行if判斷,答案依次輸出「1」和「3」。

 

Add函數帶入的是b而不是*b,因此只能在AC中選,可是i.(Integer)通過類型斷言之後就是Integer類型了,沒法自動轉成*Integer,因此只能選A了。若是將題目改爲sum := a.Add(b)則能夠選AC

 

不定參以「值」的切片類型傳入,無參數傳入則爲空。 D正確。
函數的定義:func Append(s Value, x ...Value) Value
函數不定參的解釋:

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是快速模式,經過":="快速建立一個變量。

 

內存泄漏(Memory Leak)是指程序中己動態分配的堆內存因爲某種緣由程序未釋放或沒法釋放,形成系統內存的浪費,致使程序運行速度減慢甚至系統崩潰等嚴重後果。
在影響軟件系統穩定性的因素裏,咱們最擔憂的一個問題是內存泄漏,隨着系統的運行,系統消耗的內存愈來愈多,直到最後整個操做系統愈來愈慢,甚至還會致使系統崩潰。在Go語言裏,咱們檢測內存泄漏主要依靠的是go裏面的 pprof包,除此以外,咱們還可使用瀏覽器來查看系統的實時內存信息(包括CPU、goroutine等的信息。
 

實現接口時,不須要提早導入,都是隱式默認的。

 

  1. init函數能夠在任何包中有0個或1個或多個
  2. 首先初始化導入包的變量和常量,而後執行init函數,最後初始化本包的變量和常量,而後是init函數,最後是main函數;
  3. main函數只能在main包中有且只有一個,main包中也能夠有0或1或多個init函數;
  4. init函數和main函數都不能被顯示調用;

 

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 才能夠遞歸

 

Golang中大多數數據類型均可以轉化爲有效的JSON文本,除了channel、complex、函數等。
 
Go語言中的引用類型只有五個:切片    映射    函數    方法    通道。
nil只能賦值給指針、channel、func、interface、map或slice類型的變量。若是將nil賦值給其餘變量的時候將會引起panic。 
 

3、參考資料

GoConvey_初步認識

golang語言反射三定律

匿名函數_Go語言聖經

GoConvey框架使用指南

go vet與go tool vet_極客學院

若是你用Go,不要忘了vet

vet 命令

go vet 學習筆記

Golang 序列化方式及對比

 

4、總結

本次練習把牛客網最後的34道Go語言練習題所有搞完了。涉及構造函數、GoConvey框架、反射、vet指令、序列化、main函數概念、錯誤設計、init函數、add函數、接口、匿名函數、Cgo、defer表達式等。

不斷迭代,不斷更新,不斷嘗試並不斷進步。

後期將着重學習Go語言的框架和項目實踐學習。

相關文章
相關標籤/搜索