go習題二

gongpulin發表於2017-12-26

能力模型

級別 模型
初級
primary
熟悉基本語法,能夠看懂程式碼的意圖;
在他人指導下能夠完成使用者故事的開發,編寫的程式碼符合CleanCode規範;
中級
intermediate
能夠獨立完成使用者故事的開發和測試;
能夠嗅出程式碼的壞味道,並知道如何重構達成目標;
高階
senior
能夠開發出高質量高效能的程式碼;
能夠熟練使用高階特性,開發程式設計框架或測試框架;

選擇題

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

    參考答案:AC

  2. [primary] 定義一個包內全域性字串變數,下面語法正確的是 ()
    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. [primary] 關於介面和類的說法,下面說法正確的是()
    A. 一個類只需要實現了介面要求的所有函式,我們就說這個類實現了該介面
    B. 實現類的時候,只需要關心自己應該提供哪些方法,不用再糾結介面需要拆得多細才合理
    C. 類實現介面時,需要匯入介面所在的包
    D. 介面由使用方按自身需求來定義,使用方無需關心是否有其他模組定義過類似的介面

    參考答案:ABD

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

    參考答案:BD

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

    參考答案:AD

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

    參考答案:AB

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

    參考答案:CD

  9. [intermediate] 對於函式定義:

    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. [primary] 關於型別轉化,下面語法正確的是()
    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. [primary] 關於區域性變數的初始化,下面正確的使用方式是()
    A. var i int = 10
    B. var i = 10
    C. i := 10
    D. i = 10

    參考答案:ABC

  12. [primary] 關於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. [primary] 關於布林變數b的賦值,下面錯誤的用法是()
    A. b = true
    B. b = 1
    C. b = bool(1)
    D. b = (1 == 2)

    參考答案:BC

  14. [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

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

    參考答案:BD

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

    參考答案:ACD

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

    參考答案:ABCD

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

    參考答案:BC

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

    參考答案:ABCD

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

    參考答案:BD

  21. [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

  22. [intermediate] 從切片中刪除一個元素,下面的演算法實現正確的是()
    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. [primary] 對於區域性變數整型切片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. [primary] 關於變數的自增和自減操作,下面語句正確的是()
    A.

    i := 1
    i++

    B.

    i := 1
    j = i++

    C.

    i := 1
    ++i

    D.

    i := 1
    i--

    參考答案:AD

  25. [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

  26. [intermediate] 如果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. [intermediate] 如果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. [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

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

    參考答案:AD

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

    參考答案:ABC

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

    參考答案:ABC

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

    參考答案:ABC

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

    參考答案:BCD

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

    參考答案:ABD

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

    參考答案:BD

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

    參考答案:AC

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

    參考答案:ABD

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

    參考答案:ABD

  39. [intermediate] 關於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. [intermediate] 關於channel的特性,下面說法正確的是()
    A. 給一個 nil channel 傳送資料,造成永遠阻塞
    B. 從一個 nil channel 接收資料,造成永遠阻塞
    C. 給一個已經關閉的 channel 傳送資料,引起 panic
    D. 從一個已經關閉的 channel 接收資料,立即返回一個零值

    參考答案:ABCD

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

    參考答案:D

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

    參考答案:ABCD

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

    參考答案:BD

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

    參考答案:ABC

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

    參考答案:ABC

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

    參考答案:AC

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

    參考答案:AB

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

    參考答案:ABD

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

    參考答案:ABC

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

    參考答案:BD

填空題

  1. [primary] 宣告一個整型變數i__________

    參考答案:var i int

  2. [primary] 宣告一個含有10個元素的整型陣列a__________

    參考答案:var a [10]int

  3. [primary] 宣告一個整型陣列切片s__________

    參考答案:var s []int

  4. [primary] 宣告一個整型指標變數p__________

    參考答案:var p *int

  5. [primary] 宣告一個key為字串型value為整型的map變數m__________

    參考答案:var map[string]int

  6. [primary] 宣告一個入參和返回值均為整型的函式變數f__________

    參考答案:var f func(a int) int

  7. [primary] 假設原始檔的命名為slice.go,則測試檔案的命名為__________

    參考答案:slice_test.go

  8. [primary] 假設原始檔的命名為slice.go,則測試檔案的命名為__________

    參考答案:slice_test.go

  9. [primary] go test要求測試函式的字首必須命名為__________

    參考答案:Test

  10. [intermediate] 下面的程式的執行結果是__________

    for i := 0; i < 5; i++ {
        defer fmt.Printf("%d ", i)
    }

    參考答案:4 3 2 1 0

  11. [intermediate] 下面的程式的執行結果是__________

    func main() {
        x := 1
        {
            x := 2
            fmt.Print(x)
        }
        fmt.Println(x)
    }

    參考答案:21

  12. [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

  13. [intermediate] 下面的程式的執行結果是__________

    func main() {  
        x := []string{"a", "b", "c"}
        for v := range x {
            fmt.Print(v)
        }
    }

    參考答案:012

  14. [intermediate] 下面的程式的執行結果是__________

    func main() {  
        x := []string{"a", "b", "c"}
        for _, v := range x {
            fmt.Print(v)
        }
    }

    參考答案:abc

  15. [primary] 下面的程式的執行結果是__________

    func main() {  
        i := 1
        j := 2
        i, j = j, i
        fmt.Printf("%d%d\n", i, j)
    }

    參考答案:21

  16. [primary] 下面的程式的執行結果是__________

    func incr(p *int) int {
        *p++  
        return *p 
    }
    func main() {  
        v := 1 
        incr(&v)
        fmt.Println(v)
    }

    參考答案:2

  17. [primary] 啟動一個goroutine的關鍵字是__________

    參考答案:go

  18. [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

判斷題

  1. [primary] 陣列是一個值型別()

    參考答案:T

  2. [primary] 使用map不需要引入任何庫()

    參考答案:T

  3. [intermediate] 內建函式delete可以刪除陣列切片內的元素()

    參考答案:F

  4. [primary] 指標是基礎型別()

    參考答案:F

  5. [primary] interface{}是可以指向任意物件的Any型別()

    參考答案:T

  6. [intermediate] 下面關於檔案操作的程式碼可能觸發異常()

    file, err := os.Open("test.go")
    defer file.Close()
    if err != nil {
         fmt.Println("open file failed:", err)
         return
    }
    ...

    參考答案:T

  7. [primary] Golang不支援自動垃圾回收()

    參考答案:F

  8. [primary] Golang支援反射,反射最常見的使用場景是做物件的序列化()

    參考答案:T

  9. [primary] Golang可以複用C/C++的模組,這個功能叫Cgo()

    參考答案:F

  10. [primary] 下面程式碼中兩個斜點之間的程式碼,比如json:"x",作用是X欄位在從結構體例項編碼到JSON資料格式的時候,使用x作為名字,這可以看作是一種重新命名的方式()

    type Position struct {
        X int `json:"x"`
        Y int `json:"y"`
        Z int `json:"z"`
    }

    參考答案:T

  11. [primary] 通過成員變數或函式首字母的大小寫來決定其作用域()

    參考答案:T

  12. [primary] 對於常量定義zero(const zero = 0.0),zero是浮點型常量()

    參考答案:F

  13. [primary] 對變數x的取反操作是~x()

    參考答案:F

  14. [primary] 下面的程式的執行結果是xello()

    func main() {
        str := "hello"
        str[0] = 'x'
        fmt.Printfln(str)
    }

    參考答案:F

  15. [primary] golang支援goto語句()

    參考答案:T

  16. [primary] 下面程式碼中的指標p為野指標,因為返回的棧記憶體在函式結束時會被釋放()

    type TimesMatcher struct {
        base int
    }
    func NewTimesMatcher(base int) *TimesMatcher{
        return &TimesMatcher{base:base}
    }
    func main() {
        p := NewTimesMatcher(3)
        ...
    }

    參考答案:F

  17. [primary] 匿名函式可以直接賦值給一個變數或者直接執行()

    參考答案:T

  18. [primary] 如果呼叫方呼叫了一個具有多返回值的方法,但是卻不想關心其中的某個返回值,可以簡單地用一個下劃線“_”來跳過這個返回值,該下劃線對應的變數叫匿名變數()

    參考答案:T

  19. [primary] 在函式的多返回值中,如果有error或bool型別,則一般放在最後一個()

    參考答案:T

  20. [primary] 錯誤是業務過程的一部分,而異常不是()

    參考答案:T

  21. [primary] 函式執行時,如果由於panic導致了異常,則延遲函式不會執行()

    參考答案:F

  22. [intermediate] 當程式執行時,如果遇到引用空指標、下標越界或顯式呼叫panic函式等情況,則先觸發panic函式的執行,然後呼叫延遲函式。呼叫者繼續傳遞panic,因此該過程一直在呼叫棧中重複發生:函式停止執行,呼叫延遲執行函式。如果一路在延遲函式中沒有recover函式的呼叫,則會到達該攜程的起點,該攜程結束,然後終止其他所有攜程,其他攜程的終止過程也是重複發生:函式停止執行,呼叫延遲執行函式()

    參考答案:F

  23. [primary] 任何型別都可以被Any型別引用,Any型別就是空介面,即interface{}()

    參考答案:T

  24. [intermediate] 可以給任意型別新增相應的方法()

    參考答案:F

  25. [primary] golang雖然沒有顯式的提供繼承語法,但是通過匿名組合實現了繼承()

    參考答案:T

  26. [primary] 使用for range迭代map時每次迭代的順序可能不一樣,因為map的迭代是隨機的()

    參考答案:T

  27. [primary] switch後面可以不跟表示式()

    參考答案:T

  28. [intermediate] 結構體在序列化時非匯出變數(以小寫字母開頭的變數名)不會被encode,因此在decode時這些非匯出變數的值為其型別的零值()

    參考答案:T

  29. [primary] golang中沒有建構函式的概念,物件的建立通常交由一個全域性的建立函式來完成,以NewXXX來命名()

    參考答案:T

  30. [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

  31. [intermediate] channel本身必然是同時支援讀寫的,所以不存在單向channel()

    參考答案:F

  32. [primary] import後面的最後一個元素是包名()

    參考答案:F

相關文章