Go 語言精編面試50題,請收藏!

Laravel00發表於2022-01-10

文章來自微信公眾號:Go語言圈


1 下面屬於關鍵字的是()
A. func
B. def
C. struct
D. class

參考答案:AC

2 定義一個包內全域性字串變數,下面語法正確的是 ()
A. var str string
B. str := “”
C. str = “”
D. var str = “”

參考答案:AD


3 [primary] 通過指標變數 p 訪問其成員變數 name,下面語法正確的是()
A. a.b
B. (*a).b
C. &a.b
D. a->b

參考答案:AB


4 關於介面和類的說法,下面說法正確的是()
A. 一個類只需要實現了介面要求的所有函式,我們就說這個類實現了該介面
B. 實現類的時候,只需要關心自己應該提供哪些方法,不用再糾結介面需要拆得多細才合理
C. 類實現介面時,需要匯入介面所在的包
D. 介面由使用方按自身需求來定義,使用方無需關心是否有其他模組定義過類似的介面

參考答案:ABD


5 關於字串連線,下面語法正確的是()
A. str := ‘abc’ + ‘123’
B. str := “abc” + “123”
C. str := ‘123’ + “abc”
D. fmt.Sprintf(“abc%d”, 123)

參考答案:BD


6 關於協程,下面說法正確是()
A. 協程和執行緒都可以實現程式的併發執行
B. 執行緒比協程更輕量級
C. 協程不存在死鎖問題
D. 通過channel來進行協程間的通訊

參考答案:AD


7 關於init函式,下面說法正確的是()
A. 一個包中,可以包含多個init函式
B. 程式編譯時,先執行匯入包的init函式,再執行本包內的init函式
C. main包中,不能有init函式
D. init函式可以被其他函式呼叫CD

參考答案:AB


8 關於迴圈語句,下面說法正確的有()
A. 迴圈語句既支援for關鍵字,也支援while和do-while
B. 關鍵字for的基本使用方法與C/C++中差異比較大
C. for迴圈支援continue和break來控制迴圈,但是它提供了一個更高階的
break,可以選擇中斷哪一個迴圈
D. for迴圈不支援以逗號為間隔的多個賦值語句,必須使用平行賦值的方式來初始化多
個變數

參考答案:CD


9 對於函式定義:

func add(args ...int) int {
     sum := 0
     for _, 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


10 關於型別轉化,下面語法正確的是()
A.

type MyInt int
var i int = 1
var j MyInt = i

B.

type MyInt int
var i int = 1
var j MyInt = (MyInt)i

C.

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


11 關於區域性變數的初始化,下面正確的使用方式是()
A. var i int = 10
B. var i = 10
C. i := 10
D. i = 10

參考答案:ABC


12 關於const常量定義,下面正確的使用方式是()
A.

const Pi float64 = 3.14159265358979323846
const zero = 0.0

B.

const (
    size int64 = 1024
    eof = -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


13 關於布林變數b的賦值,下面錯誤的用法是()
A. b = true
B. b = 1
C. b = bool(1)
D. b = (1 == 2)

參考答案:BC


14 下面的程式的執行結果是()

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


15 關於switch語句,下面說法正確的有()
A. 條件表示式必須為常量或者整數
B. 單個case中,可以出現多個結果選項
C. 需要用break來明確退出一個case
D. 只有在case中明確新增fallthrough關鍵字,才會繼續執行緊跟的下一個case

參考答案:BD


16 golang中沒有隱藏的this指標,這句話的含義是()
A. 方法施加的物件顯式傳遞,沒有被隱藏起來
B. golang是簡化版的面嚮物件語言
C. golang的物件導向表達更直觀,對於程式導向只是換了一種語法形式來表達
D. 方法施加的物件不需要非得是指標,也不用非得叫this

參考答案:ACD


17 golang中的引用型別包括()
A. 陣列切片
B. map
C. channel
D. interface

參考答案:ABCD


18 golang中的指標運算包括()
A. 可以對指標進行自增或自減運算
B. 可以通過“&”取指標的地址
C. 可以通過“*”取指標指向的資料
D. 可以對指標進行下標運算

參考答案:BC


19 下面說法正確的是()
A. 不允許左大括號單獨一行
B. 不允許出現未使用的變數
C. 不允許出現未使用的import
D. 不允許在一個目錄下有兩個包

參考答案:ABCD


20 下面賦值正確的是()
A. var x = nil
B. var x interface{} = nil
C. var x string = nil
D. var x error = nil

參考答案:BD


21 關於整型切片的初始化,下面正確的是()
A. s := make([]int)
B. s := make([]int, 0)
C. s := make([]int, 5, 10)
D. s := []int{1, 2, 3, 4, 5}

參考答案:BCD


22 從切片中刪除一個元素,下面的演算法實現正確的是()
A.

func (s *Slice)Remove(value interface{}) error{
    for i, v := range *s {
        if isEqual(value, v) {
            if i== len(*s) - 1 {
                *s = (*s)[:i]
            }else {
                *s = append((*s)[:i],(*s)[i + 2:]...)
            }
            return nil
        }
    }
    return ERR_ELEM_NT_EXIST
}

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


23 對於區域性變數整型切片x的賦值,下面定義正確的是()
A.

x := []int{
    1, 2, 3,
    4, 5, 6,
}

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


24 關於變數的自增和自減操作,下面語句正確的是()
A.

i := 1
i++

B.

i := 1
j = i++

C.

i := 1
++i

D.

i := 1
i--

參考答案:AD


25 關於函式宣告,下面語法錯誤的是()
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


26 如果Add函式的呼叫程式碼為:

func main() {
    var a Integer = 1
    var b Integer = 2
    var i interface{} = &a
    sum := i.(*Integer).Add(b)
    fmt.Println(sum)
}

則Add函式定義正確的是()
A.

type Integer int
func (a Integer) Add(b Integer) Integer {
     return a + b
}

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


27 如果Add函式的呼叫程式碼為:

func main() {
    var a Integer = 1
    var b Integer = 2
    var i interface{} = a
    sum := i.(Integer).Add(b)
    fmt.Println(sum)
}

則Add函式定義正確的是()
A.

type Integer int
func (a Integer) Add(b Integer) Integer {
     return a + b
}

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


28 關於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


29 關於GoMock,下面說法正確的是()
A. GoMock可以對interface打樁
B. GoMock可以對類的成員函式打樁
C. GoMock可以對函式打樁
D. GoMock打樁後的依賴注入可以通過GoStub完成

參考答案:AD


30 關於介面,下面說法正確的是()
A. 只要兩個介面擁有相同的方法列表(次序不同不要緊),那麼它們就是等價的,可以相互賦值
B. 如果介面A的方法列表是介面B的方法列表的子集,那麼介面B可以賦值給介面A
C. 介面查詢是否成功,要在執行期才能夠確定
D. 介面賦值是否可行,要在執行期才能夠確定

參考答案:ABC


31 關於channel,下面語法正確的是()
A. var ch chan int
B. ch := make(chan int)
C. <- ch
D. ch <-

參考答案:ABC


32 關於同步鎖,下面說法正確的是()
A. 當一個goroutine獲得了Mutex後,其他goroutine就只能乖乖的等待,除非該goroutine釋放這個Mutex
B. RWMutex在讀鎖佔用的情況下,會阻止寫,但不阻止讀
C. RWMutex在寫鎖佔用情況下,會阻止任何其他goroutine(無論讀和寫)進來,整個鎖相當於由該goroutine獨佔
D. Lock()操作需要保證有Unlock()或RUnlock()呼叫與之對應

參考答案:ABC


33 golang中大多數資料型別都可以轉化為有效的JSON文字,下面幾種型別除外()
A. 指標
B. channel
C. complex
D. 函式

參考答案:BCD


34 關於go vendor,下面說法正確的是()
A. 基本思路是將引用的外部包的原始碼放在當前工程的vendor目錄下面
B. 編譯go程式碼會優先從vendor目錄先尋找依賴包
C. 可以指定引用某個特定版本的外部包
D. 有了vendor目錄後,打包當前的工程程式碼到任意機器的$GOPATH/src下都可以通過編譯

參考答案:ABD


35 flag是bool型變數,下面if表示式符合編碼規範的是()
A. if flag == 1
B. if flag
C. if flag == false
D. if !flag

參考答案:BD


36 value是整型變數,下面if表示式符合編碼規範的是()
A. if value == 0
B. if value
C. if value != 0
D. if !value

參考答案:AC


37 關於函式返回值的錯誤設計,下面說法正確的是()
A. 如果失敗原因只有一個,則返回bool
B. 如果沒有失敗原因,則不返回error或bool
C. 如果重試幾次可以避免失敗,則不要立即返回error或bool
D. 如果失敗原因超過一個,則返回error

參考答案:ABD


38 關於異常設計,下面說法正確的是()
A. 在程式開發階段,堅持速錯,讓程式異常崩潰
B. 在程式部署後,應恢復異常避免程式終止
C. 一切皆錯誤,不用進行異常設計
D. 對於不應該出現的分支,使用異常處理

參考答案:ABD


39 關於slice或map操作,下面正確的是()
A.

var s []int
s = append(s,1)

B.

var m map[string]int
m["one"] = 1

C.

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


40 關於channel的特性,下面說法正確的是()
A. 給一個 nil channel 傳送資料,造成永遠阻塞
B. 從一個 nil channel 接收資料,造成永遠阻塞
C. 給一個已經關閉的 channel 傳送資料,引起 panic
D. 從一個已經關閉的 channel 接收資料,立即返回一個零值

參考答案:ABCD


41 關於無緩衝和有衝突的channel,下面說法正確的是()
A. 無緩衝的channel是預設的緩衝為1的channel
B. 無緩衝的channel和有緩衝的channel都是同步的
C. 無緩衝的channel和有緩衝的channel都是非同步的
D. 無緩衝的channel是同步的,而有緩衝的channel是非同步的

參考答案:D


42 關於異常的觸發,下面說法正確的是()
A. 空指標解析
B. 下標越界
C. 除數為0
D. 呼叫panic函式

參考答案:ABCD


43 關於cap函式的適用型別,下面說法正確的是()
A. array
B. slice
C. map
D. channel

參考答案:BD


44 關於beego框架,下面說法正確的是()
A. beego是一個golang實現的輕量級HTTP框架
B. beego可以通過註釋路由、正則路由等多種方式完成url路由注入
C. 可以使用bee new工具生成空工程,然後使用bee run命令自動熱編譯
D. beego框架只提供了對url路由的處理, 而對於MVC架構中的資料庫部分未提供框架支援

參考答案:ABC


45 關於goconvey,下面說法正確的是()
A. goconvey是一個支援golang的單元測試框架
B. goconvey能夠自動監控檔案修改並啟動測試,並可以將測試結果實時輸出到web介面
C. goconvey提供了豐富的斷言簡化測試用例的編寫
D. goconvey無法與go test整合

參考答案:ABC


46 關於goconvey,下面說法正確的是()
A. go vet是golang自帶工具go tool vet的封裝
B. 當執行go vet database時,可以對database所在目錄下的所有子資料夾進行遞迴檢測
C. go vet可以使用絕對路徑、相對路徑或相對GOPATH的路徑指定待檢測的包
D. go vet可以檢測出死程式碼

參考答案:AC


47 關於map,下面說法正確的是()
A. map反序列化時json.unmarshal的入參必須為map的地址
B. 在函式呼叫中傳遞map,則子函式中對map元素的增加不會導致父函式中map的修改
C. 在函式呼叫中傳遞map,則子函式中對map元素的修改不會導致父函式中map的修改
D. 不能使用內建函式delete刪除map的元素

參考答案:AB


48 關於GoStub,下面說法正確的是()
A. GoStub可以對全域性變數打樁
B. GoStub可以對函式打樁
C. GoStub可以對類的成員方法打樁
D. GoStub可以打動態樁,比如對一個函式打樁後,多次呼叫該函式會有不同的行為

參考答案:ABD


49 關於select機制,下面說法正確的是()
A. select機制用來處理非同步IO問題
B. select機制最大的一條限制就是每個case語句裡必須是一個IO操作
C. golang在語言級別支援select關鍵字
D. select關鍵字的用法與switch語句非常類似,後面要帶判斷條件

參考答案:ABC


50 關於記憶體洩露,下面說法正確的是()
A. golang有自動垃圾回收,不存在記憶體洩露
B. golang中檢測記憶體洩露主要依靠的是pprof包
C. 記憶體洩露可以在編譯階段發現
D. 應定期使用瀏覽器來檢視系統的實時記憶體資訊,及時發現記憶體洩露問題

參考答案:BD

本作品採用《CC 協議》,轉載必須註明作者和本文連結
溫馨提示:微信搜尋並關注   學Laravel  裡面有兩套Laravel課程:【laravel7.x 從入門到核心架構講解】 與 【Laravel高階實戰教程42集】,直接獲取就可以了,學習與交流可加入:Laravel技術交流微信群

相關文章