32. map的value赋值问题
type Student struct{Name string}
m := make(map[string]Student)
这里的map的值是Student结构的值,是值引用,只读。要修改结构体的值,必须构造一个副本修改,然后再整体对应key的值。
或者map保存student的指针 m1 := make(map[string]*Student)
33. for range 的遍历引用赋值
stus := []student{}
for _, item := range stus {
m[item.Name] = &stu // 这里的stu是一个迭代器,其地址是固定的,导致所有的value都会是最后一个迭代器的值。
}
34. interface的实现问题
通过类型T的指针类型*T实现的接口,只能用指针类型进行赋值(多态)
通过类型T 实现的接口,既可以用T类型也可以用*T类型进行赋值。
35. waitGroup 与goroutine的竞速问题
wg.Add(1) 需要写在go func(){} 之前,不能写在里面
waitGroup 不能复制
36. 进程,线程以及协程之间的区别
- 进程是操作系统分配系统资源的最小单位。 32位的为4G
- 线程是操作系统调度(CPU调度)执行的最小单位。线程拥有独立的栈区,共享进程的全部资源。MB级别
- 协程是一组可复用的函数运行在一组可复用的线程上。KB级别
协程切换完全在用户空间进行;几十ns数量级
线程切换需要切换到内核空间,产生系统调用。
37. TIME_WAIT作用
1. 主动关闭方才会出现TIME_WAIT
被动关闭的一方,直接进入CLOSED状态,而主动关闭方需要等待2*MSL时间才会最终关闭 MSL - 最大数据段声明周期
原因:1 防止被动关闭方的延迟数据被人窃取
2 防止被动关闭方没有收到最后的ACK
38. channel的各种同步机制编码实现?
39. context包的作用及实现? 需要再读源码
context.TODO() context.Background()
context.WithValue()
context.WithTimeout() context.WithCancel() context.WithDeadline() timer 定时器 + channel
40. sync.Map 的用途和实现? 需要读源码 优缺点
优点:通过读写分离,降低锁时间来提高效率;
缺点:不适用于大量写的场景,这样会导致read map读不到数据而进一步加锁读取,同时dirty map也会一直晋升为read map,整体性能较差
适用场景:大量读,少量写。
41. 消息队列kafka的各种概念,及基本原理 需要知识充电了?
42. es的面试题需要刷一刷
43. channel作为函数返回值的使用
44. timer,ticker的用法
45. a, b := 1, 2 // 执行顺序无法保证,不能用于链表等操作
46. interface 判断是否为nil
使用 reflect.ValueOf(in).IsNil()
47. 使用channel实现一个交替打印0-1的程序
48. GMP调度原理阐述
49. 垃圾回收机制
追问:程序根节点是指什么?