面试题

    1. 创建数组时,是分配到栈上还是堆上?创建时默认大小?
      https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-stack-management/
    2. goroutine在什么时候会发生上下文切换
      阿里一面
      goroutine并不能像线程的调度那样,goroutine调度时,必须由当前正在占用CPU的goroutine主动让出CPU给新的goroutine,才能完成切换操作。
      具体实现是这样的:
      • go对所有的系统调用进行了封装
      • 当前执行的goroutine如果正在执行系统调用或者可能会导致当前goroutine阻塞的操作时,runtime就会把当前这个goroutine切换掉。
      因此一个很有意思的事情就发生了,如果当前的goroutine没有出现上述的可能会导致goroutine切换的条件时,就可以一直占用CPU(实际上只是一直占用线程),而且并不会因为这个goroutine占用时间太长而进行切换。
      知道goroutine的调度策略之后,可以想到这种策略可能会带来的问题,假如有n个goroutine出现阻塞,并且n >= GOMAXPROCS时,将会导致整个程序阻塞。
      go给我们提供了一个方法runtime.Gosched(),调用这个方法可以让当前的goroutine主动让出CPU,这也不失为一个弥补的好方法了。而且在对go程序性能调优的时候,我们可以根据实际情况来调整GOMAXPROCS的值,例如当有密集的IO操作时,尽量把这个值设置大一点,可以避免由于大量IO操作导致阻塞线程。
    3. channel 原理
      https://www.yuque.com/u2278269/gq5x74/rx52w8
    4. 小对象GC频繁,引起的服务吞吐问题,QPS毛刺现象,go 线上性能优化,如何分析|如何优化
      分析思路:
      火焰图
      查看多有对象+被引用的对象
      go tool pprof -alloc_objects
      go tool pprof -inuse_objects
      查看CPU占用情况,发现GC扫描函数占大量CPU,runtime.scanobject等
      go tool pprof bin/dupsdc
      优化思路:减少对象分配
      对象如:string、 map[key]value、 slice、Type
      原数据结构体 优化数据结构 优化点
      map[string]SampleStruct map[[32]byte]SampleStruct key使用值类型避免对map遍历
      map[int]
      SampleStruct map[int]SampleStruct value使用值类型避免对map遍历
      simpleSlice []float64 simpleSlice [32]float64 值类型代替对象类型
      避免遍历是指,GC过程中遍历对象,