41-50

41. 下面代码中 A B 两处应该怎么修改才能顺利编译?

func main() {
    var m map[string]int        //A
    m["a"] = 1
    if v := m["b"]; v != nil {  //B
        fmt.Println(v)
    }
}
答案

应该修改成:

func main() {
    m = make(map[string]int)
    m["a"] = 1
    if v, ok := m["b"]; ok == true {
         fmt.Println(v)   
    }
}

解析:在 A 处,只声明了map m ,并没有分配内存空间,不能直接赋值,需要使用 make(),都提倡使用 make() 或者字面量的方式直接初始化 map。

B 处,v,k := m["b"] 当 key 为 b 的元素不存在的时候,v 会返回值类型对应的零值,k 返回 false。

42. 下面代码输出什么?

type A interface {
    ShowA() int
}

type B interface {
    ShowB() int
}

type Work struct {
    i int
}

func (w Work) ShowA() int {
    return w.i + 10
}

func (w Work) ShowB() int {
    return w.i + 20
}

func main() {
    c := Work{3}
    var a A = c
    var b B = c
    fmt.Println(a.ShowB())
    fmt.Println(b.ShowA())
}
  • A. 23 13

  • B. compilation error

答案

答:B

解析:

知识点:接口的静态类型。

a、b 具有相同的动态类型和动态值,分别是结构体 work 和 {3};a 的静态类型是 A,b 的静态类型是 B,接口 A 不包括方法 ShowB(),接口 B 也不包括方法 ShowA(),编译报错。看下编译错误:

43 下面代码中,x 已声明,y 没有声明,判断每条语句的对错。

答案

答:错、对、对、错

知识点:变量的声明。

解析:

1.错,x 已经声明,不能使用 :=;2.对;3.对,当多值赋值时,:= 左边的变量无论声明与否都可以;4.错,y 没有声明。

44. 下面代码输出什么?

答案

答:0 1

解析:

知识点:defer、返回值。

先 return 后 defer defer的时候,会缓存当前变量的值。

45. 下面代码输出什么?

A

46. f1()、f2()、f3() 函数分别返回什么?

1 5 1

47. 下面代码段输出什么?

29 29 28

48. 下面这段代码正确的输出是什么?

  • A. F M D

  • B. D F M

  • C. F D M

答:C

解析:

被调用函数里的 defer 语句在返回之前就会被执行,所以输出顺序是 F D M。

49.

50. 下面的两个切片声明中有什么区别?哪个更可取?

解析:

A 声明的是 nil 切片;B 声明的是长度和容量都为 0 的空切片。第一种切片声明不会分配内存,优先选择。

最后更新于

这有帮助吗?