go高阶知识
1.GMP
- sysmon sysmon是我们的保洁阿姨,它是一个M,又叫监控线程,不需要P就可以独立运行,每20us~10ms会被唤醒一次出来打扫卫生,主要工作就是回收垃圾、回收长时间系统调度阻塞的P、向长时间运行的G发出抢占调度等等。
- G会运行在M上需要一个P 1/61概率
2.go struct能不能比较
- 不同类型的 struct 之间不能进行比较,编译期就会报错(GoLand 会直接提示) 同类型的 struct 也分为两种情况, struct 的所有成员都是可以比较的,则该 strcut 的不同实例可以比较 struct 中含有不可比较的成员(如 Slice),则该 struct 不可以比较
3.select可以用于什么
- 常用语gorotine的完美退出 golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作 每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作
4.context包的用途
Context通常被译作上下文,它是一个比较抽象的概念,其本质,是【上下上下】存在上下层的传递,上会把内容传递给下。在Go语言中,程序单元也就指的是Goroutine 用于协程退出
5. 主协程如何等其余协程完再操作
waitGroup channel context
6.slice,len,cap,共享,扩容
slice底层实现是数组 可以用cap 和len 扩容后地址会变 双倍扩容 超过1024 就1024点四分之一增长
7. map如何顺序读取
map的key进行排序然后输出
8. 实现set
type inter interface{}
type Set struct {
m map[inter]bool
sync.RWMutex
}
func New() *Set {
return &Set{
m: map[inter]bool{},
}
}
func (s *Set) Add(item inter) {
s.Lock()
defer s.Unlock()
s.m[item] = true
}
9.http get跟head/状态码/http keep-alive/http能不能一次连接多次请求,不等后端返回
- http的get和head本质都是一次请求,区别是head只会获取头信息,状态码1000-500 -http本质上市使用socket连接,因此发送请求,接写入tcp缓冲,是可以多次进行的,这也是http是无状态的一种
- client发出的HTTP请求头需要增加Connection:keep-alive字段 Web-Server端要能识别Connection:keep-alive字段,并且在http的response里指定Connection:keep-alive字段,告诉client,我能提供keep-alive服务,并且"应允"client我暂时不会关闭socket连接
10. tcp与udp区别,udp优点,适用场景
tcp 有状态连接 3次握手 可靠 字节流 socket udp 无状态连接 传输流 不可靠 速度快
11.time-wait的作用
- 为了保证客户端发送的最后一个ack报文段能够到达服务器。因为这最后一个ack确认包可能会丢失
- 原因2:在第四次挥手后,经过2msl的时间足以让本次连接产生的所有报文段都从网络中消失,这样下一次新的连接中就肯定不会出现旧连接的报文段了。
12. slice和数组,slice底层结构
slice是动态的 是引用类型 数组是固定的 不同大小的数组就是不同的类型 切片的底层结构是一个指向数组地址的指针和cap len