以下是2019年6月在Twitter和Facebook上发布的所有测验以及它们的解释。
测验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
在第12行中,我们把函数 hello 赋给了变量h ,而不是hello() 的返回值。12,因此h 不为零,程序将打印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 。15行中打印的,实际上是第9行中定义的那个。第9行定义的变量,而不是第12行定义的变量。12.因此,这个程序将打印2 。
测验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
分片i 被传递给第13行的变量函数hello() 函数。13. 要知道为什么会发生这种情况,请阅读 "将片断传递给 golangbot.com/variadic-fu… 中的变量函数"一节。
如果你阅读了golangbot.com/arrays-and-… 中的 "将片断传递给函数"一节,你就会明白,在函数中对片断的改变对调用者是可见的。因此,第14行将打印出14将打印18 。
小测验 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 是相等的,因此这个程序打印出equal 。
测验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行中,我们把 的地址分配给了。在上述程序的第14行,我们把rect 的地址分配给了r 。你可能会想,为什么我们在第15行没有使用(*r).area() ,程序却能正常运行。15.因为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 。因此,当i 在第9行被类型转换为字符串时, 被打印出来。9的时候,A 被打印出来。
第9小题
package main
import (
"fmt"
)
func main() {
a := 5
b := 8.1
fmt.Println(a + b)
}
选项
13.1
13
compilation error
答案
compilation error
a的类型是int ,b的类型是float64 。我们试图在第10行添加一个int 和float64 。10.这是不允许的,因此程序将无法编译,错误为*./prog.go:10:16:无效操作:a+b(类型int和float64不匹配)*。
测验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
延迟函数的参数在执行延迟语句时被评估,而不是在实际调用函数时被评估。因此,在第12行遇到defer语句时, 的值是5。12时,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函数不返回任何东西,如果指定的键不存在,则不做任何事情。9行中的删除函数不返回任何东西,如果指定的键不存在,则不会做任何事情。由于键h 不存在,删除函数不会做任何事情。在第10行中,我们试图打印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 。