go核心要点
1、go在语言层面上做哪些优化?
程序本质上是变量+函数,go语言在变量方面提供了紧凑的内存使用;在函数方面,提供了内联机制,减少函数调用开销,但是内联也是有代价的,增加了编译后二进制文件的大小。
2、goroutine如何实现同步功能?请用代码实现
方案一:通过sync.WaitGroup//适用于需同步线程个数明确的情况
方案二:通过channel
方案三:context
3、go中有哪些协程安全的类型?
channel、sync.Map
对于数据想要线程安全,离不开锁机制。关键点在于锁机制运用方面的优化与封装,对性能有影响。因此像sync.Map中通过空间换时间的方式冗余数据,针对读多写少的一些场景可以考虑这么使用。
sync.Map是一个高度封装的结构体,通过Store、Load存取数据,通过Range方法遍历数据,通过Delete删除数据。
4、go中sync.Mutex(互斥锁)与sync.RWMutex(读写锁)的区别与使用方式
Mutex用于读写不确定的情况
RWMutex适用于读多写少的问题,其本质上也是Mutex的封装
5、反射的应用
https://www.jianshu.com/p/8c0669d8adc3
6、go语言中如何高效实现快排?
7、go语言中令牌池如何设计?
令牌池有哪些应用场景呢?
8、go中闭包函数的用法
闭包的使用主要是面向于函数式编程,看哪些地方有返回函数的需求。
9、go中goroutine超时控制,如何封装在框架里面呢?已经有很好的解决方案,context。
10、map高并发访问与sync.Map性能对比?
不如问道map控制并发访问的方式有哪些?该问题的答案是:针对Map类型,可以通过加RWMutex或者Channel的方式来实现,其中通过读写锁的性能其实更高,但要求代码逻辑要严谨;对于sync.Map,可以通过Store、Load、Delete等方式直接操作,相关包以进行封装,通过空间换时间,不易出问题。
11、请通过go设计一个高并发的日志框架?
12、gdb调试法方法
13、明白切片slice的数据结构
slice由指向数组的指针以及len和cap组成。其中len和cap分别代表什么?其实质都是数组的拷贝,当cap小于1024的时候,每当需要扩充时都是2*cap。使用时,建议预先分配好,防止append的时候重新分配复制之前的数据,减少不必要的性能损耗。
type Slice struct{
ptr unsafe.Pointer
len int
cap int
}
14、接口一般以er结尾,如writer、reader
15、C语言基本类型包括基本类型(数值类型、字符类型)、构造类型(结构体、枚举、数组)、指针类型、空类型。
16、go中存在两种interface,无方法的interface有方法的interface。两种interface的内部定义不同,但都是由结构体构成。其实本质上都是由基本类型构成。
17、计算机世界由基本类型所组成的变量与函数构成,基于某一些需求通过封装的手段提供如sync.Map类型对应的结构体和方法。
18、context包已提供两个结构体,context.Background 与 context.ToDo
19、context利用close(chan)一个只读的channel来实现广播功能,其中chan是引用传递。因此,只要close(chan)是可以起到广播效果。
20、go中new与make都是用于内存分配,其中make只用于chan、map以及slice的内存创建。但是实际使用过程中,new很少使用,一般通过短语句声明即可。
21、对于编译型语言,要通过压测观察是否存在内存泄漏,那么究竟要考虑多大的并发量呢?
22、对于IO多路复用,select、pool采用的轮询模式,epool采用的回调机制。但是万一客户端很活跃,系统回调会产生许多并发线程,负载较高。
23、什么是WebSocket?
25、go---netpoll实现原理?类比channel---select?
27、在信息传递过程中,面对面沟通的效率时最高的,而纸质交流效率最低。那么为何还需要纸质文档?---记录功能
28、一定要培养自己发现问题、解决问题的能力
29、go中数据的流动交给channel,数据的处理交给goroutine
30、服务器端接口客户端请求,公有IP和私有IP之分
比如我们访问百度时,百度Server端接收的是公网IP。
一个内网内的两台电脑同时访问百度,NAT会把两个内网IP:PORT转为外网IP:PORT,对于百度来说,就是同一个IP的两个Port访问。
31、504网关超时
32、goroot与gopath有何区别?
33、可以通过配置WSL中的GO相关配置,实现编译等功能。已验证。
34、重要的是编程思想,比如高并发情况下,java/.net/go是如何实现的?
35、计算机资源都是有限的,实现高并发、高性能、可扩展的应用程序即实现各阶段、各细节的最优化,最优化,最常见的即为内存最优化以及CPU资源最优化,因此涉及到内存GC以及CPU资源调度。
36、每一个微服务都要以高性能、高可用、可扩展为目标进行设计,亦可针对某一些场景做取舍。
高可用:万变不离其宗---冗余方案
高性能:低时延、高并发
可扩展:一是从应用程序的角度看;二是应用程序无状态化。
37、同步与异步关注于消息通知机制,阻塞与非阻塞表示线程运行状态