Go面试题16

Posted by     "" on Tuesday, December 24, 2019

Go 面试题16

1: 切片a,b,c的长度和容量分别是多少?

func main() {
    s := [3]int{1,2,3}
    a := s[:0]
    b := s[:2]
    c := s[1:2:cap(s)]
}

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

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

3: 下面代码输出什么?

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

参考答案及解析

1: 答案及解析: a,b,c的长度和容量分别是0 3, 2 3, 1 2. 知识点: 数组或者切片的截取操作.截取操作有带2个或者3个参数,形如[i:j][i:j:k], 假设截取对象的底层数组长度为l.在操作符[i:j]中,如果i省略,默认为0,如果j省略,默认为底层数组的长度, 截取得到的切片长度和容量计算方法是j-i, l-i.操作符[i:j:k],k主要是用来限制切片的容量, 但是不能大于数组的长度l,截取得到的切片长度和容量计算方法是j-i, k-i.

2: 答案及解析:

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

A处只声明了map m,并没有分配内存空间,不能直接赋值, 需要使用make(), 都提倡使用make()或者字面量的方式直接初始化map.
B处, v, k := m["b"]keyb的元素不存在的生时候,v会返回值类型的对应的零值,k返回false.

3: 答案及解析: B.知识点: 接口的静态类型. a, b都具有动态类型和动态值,分别是结构体Work{3}; a的静态类型是A,b的静态类型是B, 接口A不包括方法ShowB(). 接口B 也不包括方法ShowA(),编译报错. 看下编译错误:

a.ShowB undefined (type A has no field or method ShowB)
b.ShowA undefined (type B has no field or method ShowA)

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

使用微信扫描二维码完成支付