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"]
当key
为b
的元素不存在的生时候,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)
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付