2019年6月测验答案和解释

101 阅读5分钟

以下是2019年6月在TwitterFacebook上发布的所有测验以及它们的解释。

测验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中的数值类型,可以进行比较。如果两个数组的对应元素相等,那么它们就是相等的。在我们的例子中,ab 是相等的,因此这个程序打印出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行添加一个intfloat64 。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 。因此inil

第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