2023年1月21日

go mod

摘要: 创建go.mod 在当前目录下生成一个go.mod文件 go mod init xxx(目录名称) 使用go mod管理项目,不需要把项目放到GOPATH目录下,可以在任何位置新建一个项目。go.mod所在的目录为一个模块。编译运行项目后,项目目录下多出了一个文件go.sum。go.sum是记录所依 阅读全文

posted @ 2023-01-21 20:51 王景迁 阅读(166) 评论(0) 推荐(0) 编辑

go内存逃逸

摘要: 逃逸分析 go在编译时确定是否逃逸,逃逸分析是编译器决定变量分配到栈上还是堆上的一种行为。 查看逃逸分析日志:go build -gcflags=-m其中,-m打印出逃逸分析的优化策略。 指针逃逸 函数局部变量优先分配到栈上。如果编译器不能确保变量在函数return之后不再被引用,那么编译器就会将变 阅读全文

posted @ 2023-01-21 20:40 王景迁 阅读(46) 评论(0) 推荐(0) 编辑

go检测命令

摘要: map并发读写场景未加锁 package main import "time" func main() { m := make(map[int]int) go func() { for i := 0; i < 10000; i++ { m[0] = 1 } }() go func() { for i 阅读全文

posted @ 2023-01-21 19:52 王景迁 阅读(11) 评论(0) 推荐(0) 编辑

go RWMutex源码分析

摘要: 适用场景 并发场景下读多写少。 字段含义 RWMutex基于Mutex,写优先,Lock函数(反转readerCount)会阻止新的reader获取锁。 type RWMutex struct { w Mutex // writer之间互斥 writerSem uint32 // writer信号量 阅读全文

posted @ 2023-01-21 19:30 王景迁 阅读(51) 评论(0) 推荐(0) 编辑

go sync.Once源码分析

摘要: 适用场景 服务启动时读取全局配置。单个函数流程里面只调用一次。 源码 双重检查done值是0后,加锁执行指定函数并把done值改成1。 type Once struct { done uint32 m Mutex } func (o *Once) Do(f func()) { if atomic.L 阅读全文

posted @ 2023-01-21 17:43 王景迁 阅读(17) 评论(0) 推荐(0) 编辑

go WaitGroup源码分析

摘要: 适用场景 等待若干个任务执行完成。 实现原理 字段 type WaitGroup struct { 省略 // 存储waiter数、WaitGroup计数和信号量 state1 [3]uint32 } 添加任务Add函数 设置WaitGroup计数 func (wg *WaitGroup) Add( 阅读全文

posted @ 2023-01-21 16:20 王景迁 阅读(17) 评论(0) 推荐(0) 编辑

go Channel源码分析

摘要: 理论基础 不要通过共享内存来通信,要通过通信来共享内存。 特点 通道分为非缓冲通道和缓冲通道。单向通道由双向通道转换而来,但是单向通道不能转换回双向通道。 通过make来初始化一个chan,未初始化的chan的零值是nil。 接收数据时,返回两个值。第一个值是返回的chan中的元素,第二个值是boo 阅读全文

posted @ 2023-01-21 09:59 王景迁 阅读(49) 评论(0) 推荐(0) 编辑

导航