Golang精编100题
能力模型
| 初級 primary | 熟悉基本語法,能夠看懂代碼的意圖; 在他人指導下能夠完成用戶故事的開發,編寫的代碼符合CleanCode規范; |
| 中級 intermediate | 能夠獨立完成用戶故事的開發和測試; 能夠嗅出代碼的壞味道,并知道如何重構達成目標; |
| 高級 senior | 能夠開發出高質量高性能的代碼; 能夠熟練使用高級特性,開發編程框架或測試框架; |
選擇題
[primary]?下面屬于關鍵字的是()
A. func
B. def
C. struct
D. class
參考答案:AC
[primary]?定義一個包內全局字符串變量,下面語法正確的是 ()
A. var str string
B. str := ""
C. str = ""
D. var str = ""
參考答案:AD
[primary]?通過指針變量 p 訪問其成員變量 name,下面語法正確的是()
A. a.b
B. (*a).b
C. &a.b
D. a->b
參考答案:AB
[primary]?關于接口和類的說法,下面說法正確的是()
A. 一個類只需要實現了接口要求的所有函數,我們就說這個類實現了該接口
B. 實現類的時候,只需要關心自己應該提供哪些方法,不用再糾結接口需要拆得多細才合理
C. 類實現接口時,需要導入接口所在的包
D. 接口由使用方按自身需求來定義,使用方無需關心是否有其他模塊定義過類似的接口
參考答案:ABD
[primary]?關于字符串連接,下面語法正確的是()
A. str := ‘abc’ + ‘123’
B. str := "abc" + "123"
C. str := '123' + "abc"
D. fmt.Sprintf("abc%d", 123)
參考答案:BD
[primary]?關于協程,下面說法正確是()
A. 協程和線程都可以實現程序的并發執行
B. 線程比協程更輕量級
C. 協程不存在死鎖問題
D. 通過channel來進行協程間的通信
參考答案:AD
[intermediate]?關于init函數,下面說法正確的是()
A. 一個包中,可以包含多個init函數
B. 程序編譯時,先執行導入包的init函數,再執行本包內的init函數
C. main包中,不能有init函數
D. init函數可以被其他函數調用CD
參考答案:AB
[primary]?關于循環語句,下面說法正確的有()
A. 循環語句既支持for關鍵字,也支持while和do-while
B. 關鍵字for的基本使用方法與C/C++中差異比較大
C. for循環支持continue和break來控制循環,但是它提供了一個更高級的
break,可以選擇中斷哪一個循環
D. for循環不支持以逗號為間隔的多個賦值語句,必須使用平行賦值的方式來初始化多
個變量
參考答案:CD
[intermediate]?對于函數定義:
func add(args ...int) int {sum := 0for _, arg := range args {sum += arg}return sum }下面對add函數調用正確的是()
A. add(1, 2)
B. add(1, 3, 7)
C. add([]int{1, 2})
D. add([]int{1, 3, 7}...)
參考答案:ABD
[primary]?關于類型轉化,下面語法正確的是()
A.
B.
type MyInt int var i int = 1 var j MyInt = (MyInt)iC.
type MyInt int var i int = 1 var j MyInt = MyInt(i)D.
type MyInt int var i int = 1 var j MyInt = i.(MyInt)參考答案:C
[primary]?關于局部變量的初始化,下面正確的使用方式是()
A. var i int = 10
B. var i = 10
C. i := 10
D. i = 10
參考答案:ABC
[primary]?關于const常量定義,下面正確的使用方式是()
A.
B.
const (size int64 = 1024eof = -1 )C.
const (ERR_ELEM_EXIST error = errors.New("element already exists")ERR_ELEM_NT_EXIST error = errors.New("element not exists") )D.
const u, v float32 = 0, 3 const a, b, c = 3, 4, "foo"參考答案:ABD
[primary]?關于布爾變量b的賦值,下面錯誤的用法是()
A. b = true
B. b = 1
C. b = bool(1)
D. b = (1 == 2)
參考答案:BC
[intermediate]?下面的程序的運行結果是()
func main() { if (true) {defer fmt.Printf("1")} else {defer fmt.Printf("2")}fmt.Printf("3") }A. 321
B. 32
C. 31
D. 13
參考答案:C
[primary]?關于switch語句,下面說法正確的有()
A. 條件表達式必須為常量或者整數
B. 單個case中,可以出現多個結果選項
C. 需要用break來明確退出一個case
D. 只有在case中明確添加fallthrough關鍵字,才會繼續執行緊跟的下一個case
參考答案:BD
[intermediate]?golang中沒有隱藏的this指針,這句話的含義是()
A. 方法施加的對象顯式傳遞,沒有被隱藏起來
B. golang是簡化版的面向對象語言
C. golang的面向對象表達更直觀,對于面向過程只是換了一種語法形式來表達
D. 方法施加的對象不需要非得是指針,也不用非得叫this
參考答案:ACD
[intermediate]?golang中的引用類型包括()
A. 數組切片
B. map
C. channel
D. interface
參考答案:ABCD
[intermediate]?golang中的指針運算包括()
A. 可以對指針進行自增或自減運算
B. 可以通過“&”取指針的地址
C. 可以通過“*”取指針指向的數據
D. 可以對指針進行下標運算
參考答案:BC
[primary]?下面說法正確的是()
A. 不允許左大括號單獨一行
B. 不允許出現未使用的變量
C. 不允許出現未使用的import
D. 不允許在一個目錄下有兩個包
參考答案:ABCD
[intermediate]?下面賦值正確的是()
A. var x = nil
B. var x interface{} = nil
C. var x string = nil
D. var x error = nil
參考答案:BD
[intermediate]?關于整型切片的初始化,下面正確的是()
A. s := make([]int)
B. s := make([]int, 0)
C. s := make([]int, 5, 10)
D. s := []int{1, 2, 3, 4, 5}
參考答案:BCD
[intermediate]?從切片中刪除一個元素,下面的算法實現正確的是()
A.
B.
func (s *Slice)Remove(value interface{}) error{for i, v := range *s {if isEqual(value, v) {*s = append((*s)[:i],(*s)[i + 1:])return nil}}return ERR_ELEM_NT_EXIST }C.
func (s *Slice)Remove(value interface{}) error{for i, v := range *s {if isEqual(value, v) {delete(*s, v)return nil}}return ERR_ELEM_NT_EXIST }D.
func (s *Slice)Remove(value interface{}) error{for i, v := range *s {if isEqual(value, v) {*s = append((*s)[:i],(*s)[i + 1:]...)return nil}}return ERR_ELEM_NT_EXIST }參考答案:D
[primary]?對于局部變量整型切片x的賦值,下面定義正確的是()
A.
B.
x := []int{1, 2, 3,4, 5, 6 }C.
x := []int{1, 2, 3,4, 5, 6}D.
x := []int{1, 2, 3, 4, 5, 6,}參考答案:ACD
[primary]?關于變量的自增和自減操作,下面語句正確的是()
A.
B.
i := 1 j = i++C.
i := 1 ++iD.
i := 1 i--參考答案:AD
[intermediate]?關于函數聲明,下面語法錯誤的是()
A. func f(a, b int) (value int, err error)
B. func f(a int, b int) (value int, err error)
C. func f(a, b int) (value int, error)
D. func f(a int, b int) (int, int, error)
參考答案:C
[intermediate]?如果Add函數的調用代碼為:
func main() {var a Integer = 1var b Integer = 2var i interface{} = &asum := i.(*Integer).Add(b)fmt.Println(sum) }則Add函數定義正確的是()
A.
B.
type Integer int func (a Integer) Add(b *Integer) Integer {return a + *b }C.
type Integer int func (a *Integer) Add(b Integer) Integer {return *a + b }D.
type Integer int func (a *Integer) Add(b *Integer) Integer {return *a + *b }參考答案:AC
[intermediate]?如果Add函數的調用代碼為:
func main() {var a Integer = 1var b Integer = 2var i interface{} = asum := i.(Integer).Add(b)fmt.Println(sum) }則Add函數定義正確的是()
A.
B.
type Integer int func (a Integer) Add(b *Integer) Integer {return a + *b }C.
type Integer int func (a *Integer) Add(b Integer) Integer {return *a + b }D.
type Integer int func (a *Integer) Add(b *Integer) Integer {return *a + *b }參考答案:A
[intermediate]?關于GetPodAction定義,下面賦值正確的是()
type Fragment interface {Exec(s1Obj *object.S1Obj, transInfo *context.TransInfo) error } type GetPodAction struct { } func (g GetPodAction) Exec(s1Obj *object.S1Obj, transInfo *context.TransInfo) error {...return nil }A. var fragment Fragment = new(GetPodAction)
B. var fragment Fragment = GetPodAction
C. var fragment Fragment = &GetPodAction{}
D. var fragment Fragment = GetPodAction{}
參考答案:ACD
[intermediate]?關于GoMock,下面說法正確的是()
A. GoMock可以對interface打樁
B. GoMock可以對類的成員函數打樁
C. GoMock可以對函數打樁
D. GoMock打樁后的依賴注入可以通過GoStub完成
參考答案:AD
[intermediate]?關于接口,下面說法正確的是()
A. 只要兩個接口擁有相同的方法列表(次序不同不要緊),那么它們就是等價的,可以相互賦值
B. 如果接口A的方法列表是接口B的方法列表的子集,那么接口B可以賦值給接口A
C. 接口查詢是否成功,要在運行期才能夠確定
D. 接口賦值是否可行,要在運行期才能夠確定
參考答案:ABC
[primary]?關于channel,下面語法正確的是()
A. var ch chan int
B. ch := make(chan int)
C. <- ch
D. ch <-
參考答案:ABC
[primary]?關于同步鎖,下面說法正確的是()
A. 當一個goroutine獲得了Mutex后,其他goroutine就只能乖乖的等待,除非該goroutine釋放這個Mutex
B. RWMutex在讀鎖占用的情況下,會阻止寫,但不阻止讀
C. RWMutex在寫鎖占用情況下,會阻止任何其他goroutine(無論讀和寫)進來,整個鎖相當于由該goroutine獨占
D. Lock()操作需要保證有Unlock()或RUnlock()調用與之對應
參考答案:ABC
[intermediate]?golang中大多數數據類型都可以轉化為有效的JSON文本,下面幾種類型除外()
A. 指針
B. channel
C. complex
D. 函數
參考答案:BCD
[intermediate]?關于go vendor,下面說法正確的是()
A. 基本思路是將引用的外部包的源代碼放在當前工程的vendor目錄下面
B. 編譯go代碼會優先從vendor目錄先尋找依賴包
C. 可以指定引用某個特定版本的外部包
D. 有了vendor目錄后,打包當前的工程代碼到任意機器的$GOPATH/src下都可以通過編譯
參考答案:ABD
[primary]?flag是bool型變量,下面if表達式符合編碼規范的是()
A. if flag == 1
B. if flag
C. if flag == false
D. if !flag
參考答案:BD
[primary]?value是整型變量,下面if表達式符合編碼規范的是()
A. if value == 0
B. if value
C. if value != 0
D. if !value
參考答案:AC
[intermediate]?關于函數返回值的錯誤設計,下面說法正確的是()
A. 如果失敗原因只有一個,則返回bool
B. 如果沒有失敗原因,則不返回error或bool
C. 如果重試幾次可以避免失敗,則不要立即返回error或bool
D. 如果失敗原因超過一個,則返回error
參考答案:ABD
[intermediate]?關于異常設計,下面說法正確的是()
A. 在程序開發階段,堅持速錯,讓程序異常崩潰
B. 在程序部署后,應恢復異常避免程序終止
C. 一切皆錯誤,不用進行異常設計
D. 對于不應該出現的分支,使用異常處理
參考答案:ABD
[intermediate]?關于slice或map操作,下面正確的是()
A.
B.
var m map[string]int m["one"] = 1C.
var s []int s = make([]int, 0) s = append(s,1)D.
var m map[string]int m = make(map[string]int) m["one"] = 1參考答案:ACD
[intermediate]?關于channel的特性,下面說法正確的是()
A. 給一個 nil channel 發送數據,造成永遠阻塞
B. 從一個 nil channel 接收數據,造成永遠阻塞
C. 給一個已經關閉的 channel 發送數據,引起 panic
D. 從一個已經關閉的 channel 接收數據,立即返回一個零值
參考答案:ABCD
[intermediate]?關于無緩沖和有沖突的channel,下面說法正確的是()
A. 無緩沖的channel是默認的緩沖為1的channel
B. 無緩沖的channel和有緩沖的channel都是同步的
C. 無緩沖的channel和有緩沖的channel都是非同步的
D. 無緩沖的channel是同步的,而有緩沖的channel是非同步的
參考答案:D
[intermediate]?關于異常的觸發,下面說法正確的是()
A. 空指針解析
B. 下標越界
C. 除數為0
D. 調用panic函數
參考答案:ABCD
[intermediate]?關于cap函數的適用類型,下面說法正確的是()
A. array
B. slice
C. map
D. channel
參考答案:BD
[intermediate]?關于beego框架,下面說法正確的是()
A. beego是一個golang實現的輕量級HTTP框架
B. beego可以通過注釋路由、正則路由等多種方式完成url路由注入
C. 可以使用bee new工具生成空工程,然后使用bee run命令自動熱編譯
D. beego框架只提供了對url路由的處理, 而對于MVC架構中的數據庫部分未提供框架支持
參考答案:ABC
[intermediate]?關于goconvey,下面說法正確的是()
A. goconvey是一個支持golang的單元測試框架
B. goconvey能夠自動監控文件修改并啟動測試,并可以將測試結果實時輸出到web界面
C. goconvey提供了豐富的斷言簡化測試用例的編寫
D. goconvey無法與go test集成
參考答案:ABC
[intermediate]?關于goconvey,下面說法正確的是()
A. go vet是golang自帶工具go tool vet的封裝
B. 當執行go vet database時,可以對database所在目錄下的所有子文件夾進行遞歸檢測
C. go vet可以使用絕對路徑、相對路徑或相對GOPATH的路徑指定待檢測的包
D. go vet可以檢測出死代碼
參考答案:AC
[intermediate]?關于map,下面說法正確的是()
A. map反序列化時json.unmarshal的入參必須為map的地址
B. 在函數調用中傳遞map,則子函數中對map元素的增加不會導致父函數中map的修改
C. 在函數調用中傳遞map,則子函數中對map元素的修改不會導致父函數中map的修改
D. 不能使用內置函數delete刪除map的元素
參考答案:AB
[primary]?關于GoStub,下面說法正確的是()
A. GoStub可以對全局變量打樁
B. GoStub可以對函數打樁
C. GoStub可以對類的成員方法打樁
D. GoStub可以打動態樁,比如對一個函數打樁后,多次調用該函數會有不同的行為
參考答案:ABD
[primary]?關于select機制,下面說法正確的是()
A. select機制用來處理異步IO問題
B. select機制最大的一條限制就是每個case語句里必須是一個IO操作
C. golang在語言級別支持select關鍵字
D. select關鍵字的用法與switch語句非常類似,后面要帶判斷條件
參考答案:ABC
[primary]?關于內存泄露,下面說法正確的是()
A. golang有自動垃圾回收,不存在內存泄露
B. golang中檢測內存泄露主要依靠的是pprof包
C. 內存泄露可以在編譯階段發現
D. 應定期使用瀏覽器來查看系統的實時內存信息,及時發現內存泄露問題
參考答案:BD
填空題
[primary]?聲明一個整型變量i__________
參考答案:var i int
[primary]?聲明一個含有10個元素的整型數組a__________
參考答案:var a [10]int
[primary]?聲明一個整型數組切片s__________
參考答案:var s []int
[primary]?聲明一個整型指針變量p__________
參考答案:var p *int
[primary]?聲明一個key為字符串型value為整型的map變量m__________
參考答案:var map[string]int
[primary]?聲明一個入參和返回值均為整型的函數變量f__________
參考答案:var f func(a int) int
[primary]?假設源文件的命名為slice.go,則測試文件的命名為__________
參考答案:slice_test.go
[primary]?假設源文件的命名為slice.go,則測試文件的命名為__________
參考答案:slice_test.go
[primary]?go test要求測試函數的前綴必須命名為__________
參考答案:Test
[intermediate]?下面的程序的運行結果是__________
for i := 0; i < 5; i++ {defer fmt.Printf("%d ", i) }參考答案:4 3 2 1 0
[intermediate]?下面的程序的運行結果是__________
func main() {x := 1{x := 2fmt.Print(x)}fmt.Println(x) }參考答案:21
[intermediate]?下面的程序的運行結果是__________
func main() {strs := []string{"one", "two", "three"}for _, s := range strs {go func() {fmt.Printf("%s ", s)}()}time.Sleep(3 * time.Second) }參考答案:three three three
[intermediate]?下面的程序的運行結果是__________
func main() { x := []string{"a", "b", "c"}for v := range x {fmt.Print(v)} }參考答案:012
[intermediate]?下面的程序的運行結果是__________
func main() { x := []string{"a", "b", "c"}for _, v := range x {fmt.Print(v)} }參考答案:abc
[primary]?下面的程序的運行結果是__________
func main() { i := 1j := 2i, j = j, ifmt.Printf("%d%d\n", i, j) }參考答案:21
[primary]?下面的程序的運行結果是__________
func incr(p *int) int {*p++ return *p } func main() { v := 1 incr(&v)fmt.Println(v) }參考答案:2
[primary]?啟動一個goroutine的關鍵字是__________
參考答案:go
[intermediate]?下面的程序的運行結果是__________
type Slice []int func NewSlice() Slice {return make(Slice, 0) } func (s* Slice) Add(elem int) *Slice {*s = append(*s, elem)fmt.Print(elem)return s } func main() { s := NewSlice()defer s.Add(1).Add(2)s.Add(3) }參考答案:132
判斷題
[primary]?數組是一個值類型()
參考答案:T
[primary]?使用map不需要引入任何庫()
參考答案:T
[intermediate]?內置函數delete可以刪除數組切片內的元素()
參考答案:F
[primary]?指針是基礎類型()
參考答案:F
[primary]?interface{}是可以指向任意對象的Any類型()
參考答案:T
[intermediate]?下面關于文件操作的代碼可能觸發異常()
file, err := os.Open("test.go") defer file.Close() if err != nil {fmt.Println("open file failed:", err)return } ...參考答案:T
[primary]?Golang不支持自動垃圾回收()
參考答案:F
[primary]?Golang支持反射,反射最常見的使用場景是做對象的序列化()
參考答案:T
[primary]?Golang可以復用C/C++的模塊,這個功能叫Cgo()
參考答案:F
[primary]?下面代碼中兩個斜點之間的代碼,比如json:"x",作用是X字段在從結構體實例編碼到JSON數據格式的時候,使用x作為名字,這可以看作是一種重命名的方式()
type Position struct {X int `json:"x"`Y int `json:"y"`Z int `json:"z"` }參考答案:T
[primary]?通過成員變量或函數首字母的大小寫來決定其作用域()
參考答案:T
[primary]?對于常量定義zero(const zero = 0.0),zero是浮點型常量()
參考答案:F
[primary]?對變量x的取反操作是~x()
參考答案:F
[primary]?下面的程序的運行結果是xello()
func main() {str := "hello"str[0] = 'x'fmt.Printfln(str) }參考答案:F
[primary]?golang支持goto語句()
參考答案:T
[primary]?下面代碼中的指針p為野指針,因為返回的棧內存在函數結束時會被釋放()
type TimesMatcher struct {base int } func NewTimesMatcher(base int) *TimesMatcher{return &TimesMatcher{base:base} } func main() {p := NewTimesMatcher(3)... }參考答案:F
[primary]?匿名函數可以直接賦值給一個變量或者直接執行()
參考答案:T
[primary]?如果調用方調用了一個具有多返回值的方法,但是卻不想關心其中的某個返回值,可以簡單地用一個下劃線“_”來跳過這個返回值,該下劃線對應的變量叫匿名變量()
參考答案:T
[primary]?在函數的多返回值中,如果有error或bool類型,則一般放在最后一個()
參考答案:T
[primary]?錯誤是業務過程的一部分,而異常不是()
參考答案:T
[primary]?函數執行時,如果由于panic導致了異常,則延遲函數不會執行()
參考答案:F
[intermediate]?當程序運行時,如果遇到引用空指針、下標越界或顯式調用panic函數等情況,則先觸發panic函數的執行,然后調用延遲函數。調用者繼續傳遞panic,因此該過程一直在調用棧中重復發生:函數停止執行,調用延遲執行函數。如果一路在延遲函數中沒有recover函數的調用,則會到達該攜程的起點,該攜程結束,然后終止其他所有攜程,其他攜程的終止過程也是重復發生:函數停止執行,調用延遲執行函數()
參考答案:F
[primary]?任何類型都可以被Any類型引用,Any類型就是空接口,即interface{}()
參考答案:T
[intermediate]?可以給任意類型添加相應的方法()
參考答案:F
[primary]?golang雖然沒有顯式的提供繼承語法,但是通過匿名組合實現了繼承()
參考答案:T
[primary]?使用for range迭代map時每次迭代的順序可能不一樣,因為map的迭代是隨機的()
參考答案:T
[primary]?switch后面可以不跟表達式()
參考答案:T
[intermediate]?結構體在序列化時非導出變量(以小寫字母開頭的變量名)不會被encode,因此在decode時這些非導出變量的值為其類型的零值()
參考答案:T
[primary]?golang中沒有構造函數的概念,對象的創建通常交由一個全局的創建函數來完成,以NewXXX來命名()
參考答案:T
[intermediate]?當函數deferDemo返回失敗時,并不能destroy已create成功的資源()
func deferDemo() error {err := createResource1()if err != nil {return ERR_CREATE_RESOURCE1_FAILED}defer func() {if err != nil {destroyResource1()}}()err = createResource2()if err != nil {return ERR_CREATE_RESOURCE2_FAILED}defer func() {if err != nil {destroyResource2()}}()err = createResource3()if err != nil {return ERR_CREATE_RESOURCE3_FAILED}return nil }參考答案:F
[intermediate]?channel本身必然是同時支持讀寫的,所以不存在單向channel()
參考答案:F
[primary]?import后面的最后一個元素是包名()
參考答案:F
總結
以上是生活随笔為你收集整理的Golang精编100题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go标准命令详解0.2 go insta
- 下一篇: Go语言TCP网络编程(详细)