第1題
package main
import (
"fmt"
)
func hello() []string {
return nil
}
func main() {
h := hello
if h == nil {
fmt.Println("nil")
} else {
fmt.Println("not nil")
}
}
選項
nil
not nil
compilation error
答案
not nil
在主函數中,把 hello 函數賦值給了變量 h。在條件判斷中,h != nil,所以會打印,not nil。
第2題
package main
import (
"fmt"
"strconv"
)
func main() {
i := 2
s := "1000"
if len(s) > 1 {
i, _ := strconv.Atoi(s)
i = i + 5
}
fmt.Println(i)
}
選項
2
1005
compilation error
答案
2
主要問題點集中在第 12 行, i, _ := strconv.Atoi(s) 創建了一個新變量i ,作用域限制在 if 語句內。 但是在第 15 行打印的時候,變量 i 則是全局變量的值。
第3題
package main
import (
"fmt"
)
func hello(num ...int) {
num[0] = 18
}
func main() {
i := []int{5, 6, 7}
hello(i...)
fmt.Println(i[0])
}
選項
18
5
Compilation error
答案
18
這一題考查的是可變參數,如果把 slice 傳遞給可變參數,其作用會施加到調用者。
第 4 題
package main
import (
"fmt"
)
func main() {
a := [2]int{5, 6}
b := [2]int{5, 6}
if a == b {
fmt.Println("equal")
} else {
fmt.Println("not equal")
}
}
選項
compilation error
equal
not equal
答案
equal
數組是Go中的值類型,可以進行比較。如果對應的元素相等,則兩個數組值相等。在我們的例子中,a和b是相等的,因此這個程序打印為相等。
第 5 題
package main
import "fmt"
type rect struct {
len, wid int
}
func (r rect) area() {
fmt.Println(r.len * r.wid)
}
func main() {
r := &rect{len: 5, wid: 6}
r.area()
}
選項
compilation error
30
答案
30
這個程序將正確編譯并打印30。
第 14 行,我們把 rect 的地址分配給了 r。你可能想知道,當我們在第 15 行沒有使用(*r).area()時,為什么這個程序還能工作。由于area()有一個值接收器,所以Go足夠智能,可以將 r.area() 解釋為 (*r).area(),因此這個程序可以工作:。
第 6 題
package main
import (
"fmt"
)
func main() {
a := [5]int{1, 2, 3, 4, 5}
t := a[3:4:4]
fmt.Println(t[0])
}
選項
3
4
compilation error
答案
4
表達式
a[low : high : max]
構造與簡單的片表達式 a[low: high] 相同類型、相同長度和元素的片。
另外,它通過將結果片設置為 max - low 來控制它的容量。因此,第 9 行中的切片 t 有一個元素4,容量是1。
第 7 題
package main
import (
"fmt"
)
type person struct {
name string
}
func main() {
var m map[person]int
p := person{"mike"}
fmt.Println(m[p])
}
選項
compilation error
0
1
答案
0
當我們嘗試打印在映射中不存在的元素時,將打印該元素的零值。在我們的例子中,m是 map[person]int 類型的映射。因為p在映射中不存在,int 的初始值 0 被打印出來。
第 8 題
package main
import (
"fmt"
)
func main() {
i := 65
fmt.Println(string(i))
}
選項
A
65
compilation error
答案
A
字母 A 的 unicode值是 65。所以第 9 行,i 被強制格式化為string類型是,就打印出字母 A 了。
第 9 題
package main
import (
"fmt"
)
func main() {
a := 5
b := 8.1
fmt.Println(a + b)
}
選項
13.1
13
compilation error
答案
compilation error
這個錯誤很簡單,也很明顯。兩個變量數據類型不相同,直接運算,編譯不通過。
第 10 題
package main
import (
"fmt"
)
func main() {
var i interface{}
if i == nil {
fmt.Println("nil")
return
}
fmt.Println("not nil")
}
選項
nil
not nil
compilation error
答案
nil
空接口的基礎值和具體類型都為nil。因此 i 為 nil。
第 11 題
package main
import (
"fmt"
)
func hello(i int) {
fmt.Println(i)
}
func main() {
i := 5
defer hello(i)
i = i + 10
}
選項
5
15
答案
5
延遲函數的參數是在執行 defer 語句時求值,而不是在實際函數調用完成時求值。
因此,當遇到第 12 行中的 defer 語句時, i的值是5。這個程序會輸出5。
第 12 題
package main
import (
"fmt"
)
func main() {
fmt.Printf("%%")
}
選項
0.0
compilation error
%
答案
%
字符串格式化的知識。想打印 % 字面量,就需要用 % 進行轉移。
第 13 題
package main
import (
"fmt"
)
func main() {
s := make(map[string]int)
delete(s, "h")
fmt.Println(s["h"])
}
選項
runtime panic
0
compilation error
答案
0
第 9 行中的 delete 函數不返回任何內容,如果指定的鍵不存在,則不執行任何操作。
因為鍵 h 不存在,所以 delete 函數不會執行任何操作。
第 10 行,我們正在試著打印 s["h"] 。由于映射 s 沒有關鍵字 h ,它將返回默認的 int 值,因此輸出0。
第 14 題
package main
import (
"fmt"
)
func main() {
i := -5
j := +5
fmt.Printf("%+d %+d", i, j)
}
選項
-5 +5
+5 +5
0 0
答案
-5 +5
格式化字符串“%+d”總是返回一個數值。因此程序輸出 -5 +5。
紙上得來終覺淺,絕知此事要躬行。
趕緊打開電腦。在你熟悉的編輯器下面,實踐上面的代碼吧。
我是 @程序員小助手,持續分享編程故事,歡迎關注。