avatar
文章
163
标签
197
分类
10
首页
归档
分类
标签
书单
关于
Deng的博客
首页
归档
分类
标签
书单
关于

Deng的博客

Go进阶 - 常见坑1~10
发表于2022-04-21|AI前沿
Golang常犯错误
发表于2022-04-20|Go进阶
1.Golang常犯错误01.01~1001.nil的slice和map 允许对值为 nil 的 slice 添加元素,但对值为 nil 的 map 添加元素,则会造成运行时 panic。 123456789101112// map 错误示例func main() { var m map[string]int m["one"] = 1 // error: panic: assignment to entry in nil map // m := make(map[string]int)// map 的正确声明,分配了实际的内存} // slice 正确示例func main() { var s []int s = append(s, 1)} 02.判断map中key是否存在 当访问 map 中不存在的 key 时,Go 则会返回元素对应数据类型的零值,比如 nil、’’ 、false 和 0 取值操作总有值返回,故不能通过取出来的值,来判断 key 是不是在 map 中。 检...
Go进阶 - Golang常犯错误
发表于2022-04-20|AI前沿
mutex锁原理
发表于2021-02-23|Go进阶
1.mutex锁原理01.Mutex1.1 mutex结构体 源码包src/sync/mutex.go:Mutex定义了互斥锁的数据结构 1234type Mutex struct { state int32 // 表示互斥锁的状态,比如是否被锁定等 sema uint32 // 表示信号量,协程阻塞等待该信号量,解锁的协程释放信号量从而唤醒等待信号量的协程} 我们看到Mutex.state是32位的整型变量,内部实现时把该变量分成四份,用于记录Mutex的四种状态。 下图展示Mutex的内存布局 Locked: 表示该Mutex是否已被锁定,0:没有锁定 1:已被锁定。 Woken: 表示是否有协程已被唤醒,0:没有协程唤醒 1:已有协程唤醒,正在加锁过程中。 Starving:表示该Mutex是否处理饥饿状态, 0:没有饥饿 1:饥饿状态,说明有协程阻塞了超过1ms。 Waiter: 表示阻塞等待锁的协程个数,协程解锁时根据此值来判断是否需要释放信号量。 1.2 简单加锁 假定当前只有一个协程在加锁,没有其他...
Go进阶 - mutex锁原理
发表于2021-02-23|AI前沿
sync.Map
发表于2021-02-22|Go进阶
1.sync.map01.sync.Map介绍1.1 sync.Map介绍 简单说:空间换时间+读写分离+原子操作(快路径) sync.Map 的主要思想就是读写分离,空间换时间 。 sync.Map底层使用了两个原生map,一个叫read,仅用于读; 一个叫dirty,用于在特定情况下存储最新写入的key-value数据 1.2 sync.Map特点 1、空间换时间:通过冗余的两个Map数据结构(read、dirty),实现加锁对性能的影响。 2、使用只读数据(read),避免读写冲突。 3、动态调整,miss次数多了之后,将dirty数据迁移到read中。 4、double-checking。 5、迟删除。 删除一个键值只是打标记,只有在迁移dirty数据的时候才清理删除的数据。 6、优先从read读取、更新、删除,因为对read的读取不需要锁。 1.3 sync.Map结构体12345678910111213type Map struct { // 当涉及到脏数据(dirty)操作时候,需要使用这个锁 mu Mutex // 后面是r...
Go进阶 - sync_map
发表于2021-02-22|AI前沿
sync.Pool
发表于2021-02-21|Go进阶
1.sync.Pool01.sync.Pool介绍1.1 是什么 sync.Pool 是 sync 包下的一个组件,可以作为保存临时取还对象的一个“池子”。 个人觉得它的名字有一定的误导性,因为 Pool 里装的对象可以被无通知地被回收,可能 sync.Cache 是一个更合适的名字。 Pool 结构体的定义为: Pool 中有两个定义的公共方法,分别是 Put - 向池中添加元素; Get 从池中获取元素,如果没有,则调用 New 生成元素,如果 New 未设置,则返回 nil。 12345678910type Pool struct { noCopy noCopy local unsafe.Pointer // 本地P缓存池指针 localSize uintptr // 本地P缓存池大小 // 当池中没有可能对象时 // 会调用 New 函数构造构造一个对象 New func() interface{}} 1.2 有什么用 对于很多需要重复分配、回收内存的地方,sync.Pool 是...
Go进阶 - sync_Pool
发表于2021-02-21|AI前沿
协程调度GMP模型
发表于2021-02-20|Go进阶
1.协程调度GMP模型01.线程调度1.1 早期单线程操作系统 一切的软件都是跑在操作系统上,真正用来干活(计算)的是CPU。 早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是“单进程时代” 一切的程序只能串行发生。 1.2 多进程/线程时代 在多进程/多线程的操作系统中,就解决了阻塞的问题,因为一个进程阻塞cpu可以立刻切换到其他进程中去执行 而且调度cpu的算法可以保证在运行的进程都可以被分配到cpu的运行时间片 这样从宏观来看,似乎多个进程是在同时被运行。 但新的问题就又出现了,进程拥有太多的资源,进程的创建、切换、销毁,都会占用很长的时间 CPU虽然利用起来了,但如果进程过多,CPU有很大的一部分都被用来进行进程调度了 大量的进程/线程出现了新的问题 高内存占用 调度的高消耗CPU 进程虚拟内存会占用4GB[32位操作系统], 而线程也要大约4MB 1.3 Go协程goroutine Go中,协程被称为goroutine,它非常轻量,一个goroutine只占几KB,并且这几KB就足够gorouti...
1…111213…17
avatar
Evan Deng
文章
163
标签
197
分类
10
Follow Me
公告
This is my Blog
最新文章
Firecrawl 发布 anydoc:Rust 驱动的文档转 Markdown 新利器,支持 Office/PDF/EPUB 一键转换2026-08-06
OpenAI Astra 发布:内部版本就攻克10个长期开放的数学难题,揭开下一代模型面纱2026-08-04
OpenAI Astra 发布:内部版本就攻克10个长期开放的数学难题,揭开下一代模型面纱 2026-08-04
Gemini 3.6 Flash发布:Google的AI编程新引擎,DeepSWE跑分49%的性价比之王2026-08-03
Gemini 3.6 Flash发布:Google的AI编程新引擎,DeepSWE跑分49%的性价比之王 2026-08-03
分类
  • AI前沿97
  • GitHub开源1
  • Go基础9
  • Go常用库20
  • Go爬虫2
  • Go设计模式6
  • Go进阶19
  • Tech前沿6
标签
Google I/O 2026 IO Firecrawl 内存泄漏 设计模式 AI模型竞赛 AI网关 空间智能 登顶 GMP Meta 结构体 map GPT-5.6后时代 colly 文档处理 常犯错误 Token 编程语言 代码生成 锁原理 mod FLUX AI使用分析 发布 抽象工厂方法模式 DeepSeek-V4 常用库介绍 Kimi K2.7-Code Golang 常见坑 MAI模型 万星开源 Go基础 视频生成 多模态AI Reinforcement Learning chan 切片 Claude Opus 5
归档
  • 八月 2026 8
  • 七月 2026 43
  • 六月 2026 9
  • 七月 2025 1
  • 四月 2024 4
  • 十月 2023 2
  • 六月 2022 16
  • 五月 2022 26
网站信息
文章数目 :
163
本站访客数 :
本站总浏览量 :
最后更新时间 :
© 2025 - 2026 By Evan Deng框架 Hexo 6.3.0|主题 Butterfly 5.6.2