go高阶知识

1.GMP

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

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务