Golang9 分钟

Go 扩展字段最佳实践

未知字段默认被丢。自己写 Marshal/Unmarshal,delete 已知键,Extra 才干净。会进 checkpoint 的状态再加版本号和 Legacy。

Golang5 分钟

GMP

进程 线程 协程 进程是资源分配单位,有独立内存空间; 线程是调度单位,共享进程内存,但有独立栈; 协程是用户态轻量线程,由程序调度,切换极快,一个线程可跑几万协程 进程(Process) 是操作系统 资源分配 的最小单位。 每个进程拥有独立的地址空间、文件描述符、堆、栈等资源。 进程间切换代价最大…

Golang2 分钟

Go map:hmap、bmap 和为什么不能并发写

Go 1.23 及以前的 map 是 hmap 加一组 bmap。每个 bucket 放 8 个 key,装载因子 6.5 指的是每个 bucket 平均 6.5 个元素。内置 map 没有锁;读多写少用 sync.Map,写多且 key 分散用分片锁。

Golang2 分钟

如何避免 channel 被 close 两次

对已经关闭的 channel 再 close 会 panic。select default 分不清「空」和「关」;先查标记再关有 TOCTOU。需要多方都可能关时,用 sync.Once。

Golang2 分钟

Golang channel

数据结构 channel的地层数据结构为 hchan waitq为阻塞的协程队列 sudog用于包装协程的节点 其中的 mutex 是runtime包中,给系统运行时使用的互斥锁,使用更加地层,其直接基于semaphore原语 0表示未锁定 1表示锁定 其他值表示有等待者 每次调用semaphore…

Golang1 分钟

golang的单机锁

正常模式 两种策略 阻塞/唤醒:将当前goroutine阻塞挂起,直到锁被释放后,以回调的方式将阻塞goroutine重新唤醒,进行锁的争抢 使用场景:并发竞争激烈 优势:精准打击,不浪费时间片 劣势:需要挂起协程,进行上下文切换,操作比较重 自旋+CAS:基于自旋结合CAS的方式,反复校验锁的状态…

Golang2 分钟

内存对齐

为什么要内存对齐 平台原因 :各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如,有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐。 性能原因 :内存对齐可以提高存取效率。比如,有些平台每次读都是…

Golang3 分钟

sync/atomic包

是什么 在 Go 语言中, sync/atomic 包提供了底层的原子操作,用于对整数类型和指针类型进行原子性的读写和修改 原子操作是不可分割的操作,确保多个 goroutine 并发访问共享数据时,操作不会被中断 CPU指令级别的支持 现代CPU架构提供了一组专门的指令,用于支持原子操作。 这些指…

Golang3 分钟

go中常见的内存泄露场景

什么是内存泄漏 程序运行中,动态分配的内存未能正确释放或回收,导致内存一直被占用不能被正确释放,可能导致最终内存耗尽 系统资源耗尽 :严重的内存泄漏可能会导致系统内存耗尽,进而引发系统崩溃或其他程序无法正常运行。 程序崩溃 :如果程序无法分配到足够的内存,它可能会崩溃,尤其是在没有进行异常处理的情况…

Golang4 分钟

pprof的使用

什么是pprof pprof 是 Go 提供的性能剖析工具,允许开发者查看 CPU、内存、Goroutine 以及其他资源的使用情况 启动pprof 一旦你的应用程序运行并且 pprof 启用后,你可以通过浏览器或命令行工具访问 pprof 数据。常见的端点包括: CPU profile : htt…

Golang7 分钟

Golang 内存分配与管理机制

前沿 操作系统中存储模型 虚拟内存和物理内存 虚拟内存的意义 在用户和硬件间添加中间代理层 优化用户体验(进程感知到内存是”连续”的,如果没有虚拟内存,程序就需要自己主动维护真实的物理内存) “放大” 可用内存(虚拟内存可用由物理内存+磁盘补充,根据冷热动态置换,用户无感知) Golang 内存模型…