1、cap(map) 是否正确? 请说明理由

不正确,cap是获取slice底层结构中容量(cap)的值,而在go中map结构并没有直接获取长度的函数,若需要获取则只能通过range关键字。

2、a := make([]int, 5, 20)

fmt.Println(a[6])

fmt.Println(a[6:10])

编译通过,运行出错。数组越界,此slice是一个长度为5,容量为20的slice,而程序访问到了长度之外的数据。

3、列出 golang 的所有数据类型

这道题。。。。。。

bool,

数字类型(整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字),

字符串类型,

派生类型

  • (a) 指针类型(Pointer)
  • (b) 数组类型
  • © 结构化类型(struct)
  • (d) Channel 类型
  • (e) 函数类型
  • (f) 切片类型
  • (g) 接口类型(interface)
  • (h) Map 类型

4、所有数据类型定义时候的默认值

bool为false,int为0,slice,map为nil

5、函数接受者问题

哪个无法运行?为什么?如果能运行,使用什么方法能区别出来?或者说如何能使其中看起来不正确的使它不要运行?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type A struct {} 

func (a A) m() {
fmt.Println("func m...")
}
func (a *A) n() {
fmt.Println("func n...")
}

ao := A{}
ao.m()
ao.n()

ap := &A{}
ap.m()
ap.n()

实际运行,上下两种情况均能顺利运行。

这里区分的话,可以以修改receiver的值作为判断依据。

6、需要屏蔽 10 万个关键字, 写算法实现?

AC自动机(Aho-Corasick)。

也可以使用grep

7、Golang,empty slice 与 nil slice,json包如何应对?

1
2
3
4
5
6
7
8
9
10
var a []int
b := []int{}
bytes, err := json.Marshal(a)
fmt.Println(string(bytes), err)

bytes, err = json.Marshal(b)
fmt.Println(string(bytes), err)

// null <nil>
// [] <nil>

8、空struct{}的使用

空struct不占用内存,也就是说即使分配切片10000个空struct,也只是占用底层结构体的大小。

用途一般是:chan struct{} 比如用来实现set: map[string]struct{}

空struct相等的特性在1.6之后不支持了。

9、在Go语言中结构体是否能够比较?该如何比较两个结构体?

相同类型的结构体能够进行比较。利用字段标签和反射可以达到比较的目的。

例如库:diff

10、range 关键字

大概是有这样一串代码:

1
2
3
4
5
byteArr := []byte{1, 2, 3}
for i, val := byteArr {
byteArr := append(byteArr, 1, 2)
fmt.Println(i, val)
}

问,程序是否会终止。

答,会终止,循环三次,按原有的数据进行遍历。

参考我之前的博客:Go-Range