Go
42 篇笔记
- 1.11 arrayhistorical
1. 是什么 定长的数组 2. 使用 2.1. 数组的长度也是类型 2.2. 数组是值传递 赋值和函数传参时候是复制一份新的数组 2.3. 可以用range迭代 3. 原理 3.1. 数据结构 3.2. 创建 3.2.1. 初始化 - 第一种方式 会调用到cmd/compile/internal/t
- 1.12 slicehistorical
1. slice 是什么 支持动态扩容的数组 2. 为什么需要 slice array 元素长度固定,无法动态扩容 3. 如何使用 slice 3.1. 基本使用 3.2. 函数传参是引用 - 虽然传的是引用,但是为了避免扩容后 slice 改变,函数返回 slice 3.3. nil slice
- 1.13 deferhistorical
1. 什么是defer 让函数可以在当前函数执行完毕后执行的一种机制。 这里的函数执行完毕包括通过return正常结束或者panic导致的异常结束 2. 为什么需要defer 减少资源泄露的发生 3. 如何使用 在创建资源语句的附件,使用defer释放资源 3.1. 关闭资源 3.2. defer和
- 2.1 contexthistorical
1. context goroutine的上下文,在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。 控制并发的其中一种方式,另外一种是sync.WaitGroup.md 2. 使用 2.1. deadlines:超时取消 2.2. cancellation
- 2.2 sync.WaitGrouphistorical
1. 是什么 一种控制并发的方式 让一个goroutine等待其他goroutine完成 类似于9.CountDownLatch.md 2. 使用 3. 原理 - 里面维护了一个counter计数器 - Add 增加计数器 - Done 计数器-1 - Wait 等待计数器到达0时往下执行 4. 参
- 2.3 synchistorical
1. 是什么 提供了基本的 synchronization primitives 除了 Once 和 WaitGroup 外,大部分都是给 low-level 的库使用的 high-level 一般使用 channels 2. 有什么 2.1. Locker - 是个接口 - 有Lock和Unloc
- 2.4 sync.maphistorical
1. sync.map是什么 - 线程安全的Map - 底层使用乐观锁实现,所以适用竞争不大的场景 - 一次写多次读,如缓存的场景 - 多个goroutine读写的是没有交集的key 1.1. 并发安全的思路 - 加一把大锁 - 把map分成若干map,只操作小map 2. 使用 3. 源码分析 3
- 2.5 sync.poolhistorical
1. 是什么 保存temp object的pool。 temp表示这个对象可能会被回收,所以这个pool其实就是个cache 2. 为什么需要 将暂时不用的对象缓存起来,待下次需要的时候直接使用 这样就不用经过内存分配,减轻GC的压力 3. 怎么使用 3.1. fmt - Printf - Fpri
- 2.6 selecthistorical
1. 是什么 - 类似于IO多路复用 - 监听多个阻塞的事件,如果事件发生了,那么执行该事件逻辑 - 如果没有发生并有默认的事件,那么执行默认的事件逻辑 - 如果没有发生且没有默认的事件,那么一直阻塞 2. 使用 2.1. 基本使用 代码执行到 select 时,case 语句会按照源代码的顺序被评
- 2.7 sync.Oncehistorical
1. 是什么 Once 是一个对象,它提供了保证某个动作只被执行一次功能 说白了就是使方法只执行一次 2. 使用 2.1. 单例模式 单例模式.md 3. 原理 通过sync.atomic+sync.Mutex实现 - Do 方法为什么不直接 o.done == 0 而要使用 atomic.Load