wangzhaoo 的个人博客 wangzhaoo 的个人博客
Tags Archives Links
  • 开始使用
  • Tags
  • Archives
  • Links
  • Search
  • RSS
1. 前言 接触 Golang 有一段时间了,发现 Golang 同样需要类似 Java 中 Spring 一样的依赖注入框架。如果项目规模比较小,是否有依赖注入框架问题不大,但当项目变大之后,有一个合适的依赖注入框架是十分必要的。通过调研,了解到 Golang 中常用的依赖注入工具主要有 Inject 、Dig 等。但是今天主要介绍的是 Go 团队开发的 Wire,一个编译期实现依赖注入的工具。 什么是依赖注入 说起就要引出另一个名词( IoC )。IoC 是一种设计思想,其核心作用是降低代码的耦合度。是一种实现且用于解决依赖性问题的设计模式。 在go中,依赖注入是指组件创建的时候,就应该获取该组件所依赖的其他关系,如下代码,要创建一个App示例则需要Config和service结构体。 go type App struct { conf *Config httpServer *Server } // 构建 Config func InitConfig() *Config { return &Config{} } // 构建 Server func NewHttpServer....

Go的依赖注入-wire

Technology
在 Go 语言的并发编程世界里,sync.Mutex(互斥锁)通常是我们解决数据竞争(Data Race)的首选武器。然而,在某些追求极致性能的场景下,锁的开销(上下文切换、内核态用户态切换)可能会成为瓶颈。 这时,sync/atomic 包就闪亮登场了。它提供了底层的原子级内存操作,让我们能够以“无锁(Lock-Free)”的方式处理并发数据。 本文将带你深入了解 Atomic 的核心概念、使用场景以及它背后的黑科技。 🔍 什么是“原子操作”? 原子操作(Atomic Operation)是指不会被线程调度机制打断的操作。即使在多核 CPU 上,原子操作一旦开始,就会一直运行到结束,中间不会有任何 Context Switch(上下文切换)。 通俗理解: 如果 Mutex 是在厕所门口挂一把锁,同一时间只能进一个人; 那么 Atomic 就是厕所里只有一个超光速马桶,你还没来得及眨眼,操作就已经完成了,根本不需要锁门。 🛠️ 核心操作详解 sync/atomic 包主要提供了五类核心操作,支持的数据类型包括 int32, int64, uint32, uint64, uintpt....

Go 并发编程进阶:深入理解 sync/atomic 包

Technology
1. 概念梳理 1.1 线程 通常指内核级线程,具有以下特点:· 是操作系统的做小调度单元; 创建,销毁,调度交由内核完成,cup需要完成用户态与内核态的切换; 可充分利用多核,实现并行。 1.2 协程 协程:又称为用户级别线程,核心如下: 与线程存在映射关系:M:1 创建,销毁,调度在用户态完成,对内核透明 从属同一个内核级线程,无法并行;一个协程阻塞会导致从属同一个线程的所有协程无法执行。 1.3 Goroutine Goroutine,经Golang优化后的特殊协程,核心点如下: 与线程存在映射关系:M:N 创建,销毁,调度在用户态完成,对内核透明 可利用多个线程,实现并行。 通过调度器的调度,实现和线程间的动态绑定和灵活调度; 栈空间大小可动态扩缩,因地制宜。 实际上,“灵活调度” 一词概括得实在过于简要,Golang 在调度 goroutine 时,针对“如何减少加锁行为”,“如何避免资源不均”等问题都给出了精彩的解决方案,这一切都得益于经典的 “gmp” 模型。 2. GMP模型 GMP = goroutine+machine+processor+(一套有机组合的机制....

Golang GMP原理

Technology
Go Context 源码深度解析与最佳实践 目录 Context 核心接口设计 源码结构解析 四大核心实现 取消机制的实现原理 值传递的设计 最佳实践与业务场景 1. Context 核心接口设计 go // context.go - 核心接口定义 type Context interface { // 返回 context 被取消的时间点 Deadline() (deadline time.Time, ok bool) // 返回一个 channel,当 context 被取消时会被关闭 // 这是实现取消通知的核心机制 Done() <-chan struct{} // 返回 context 被取消的原因 Err() error // 根据 key 获取值 Value(key interface{}) interface{} } 设计思想: 返回只读 channel,利用 "关闭 channel 会通知所有接收者" 的特性实现广播 接口最小化,只有 4 个方法,符合 Go 的简洁哲学 不可变性:Context 是不可修改的,只能通过衍生创建新的 Context 2. 源码....

Context源码学习和最佳实践

Technology
Go Time 包完全指南 目录 核心类型概览 时间点操作 (Time) 时间间隔 (Duration) 定时器 (Timer) 周期触发器 (Ticker) 时间格式化 实战场景 常见陷阱 1. 核心类型概览 time 包的核心是 4 个类型: go // Time - 表示一个时间点 var t time.Time = time.Now() // Duration - 表示时间间隔(纳秒精度) var d time.Duration = 5 * time.Second // Timer - 一次性定时器 var timer *time.Timer = time.NewTimer(5 * time.Second) // Ticker - 周期性触发器 var ticker *time.Ticker = time.NewTicker(1 * time.Second) 关系图: plain text Time (时间点) ├── Now() - 获取当前时间 ├── Add(Duration) - 加上时间间隔 └── Sub(Time) - 两个时间点相减 → Duration Du....

Go标准库-Time

Technology
数据结构 双层存储架构(read vs dirty) 我们要掌握的第一个核心概念就是:sync.Map 为什么会有两个 Map? 在标准的 Go map 中,为了防止并发冲突,我们在读写时都需要加锁(Mutex)。但在高并发场景下,如果读操作很多,锁的竞争就会导致性能下降。 sync.Map 解决这个问题的策略是**“读写分离”**。它内部维护了两个字段: read (只读/快路径) 特点:访问不需要加锁(使用原子操作 atomic)。 内容:存放的是“稳定”的数据,通常是那些已经存在且主要被用于读取的 key。 比喻:就像你办公桌上的便利贴。你需要找电话号码时,第一眼先看桌上(read),因为这最快,不用起身。 dirty (脏/慢路径) 特点:访问需要加锁(mu Mutex)。 内容:存放所有的数据,包括最新写入且还没同步到 read 中的 key。 比喻:就像档案室里的文件柜。如果桌上(read)找不到,你就不得不拿钥匙(加锁),走到档案室(dirty)去翻找,这比较慢。 Entry 的三种状态(nil, expunged, 指针) 为了高效地处理读写操作,sync.Map 在底....

GO中sync.Map的底层原理

Technology
Eino框架 是由字节开发的Go的大模型应用框架,为go开发者提供类似LangChain的能力。 核心特性 组件化设计:提供chatModel、Embedding、Retrivcer、Tool等丰富的原子组件 灵活编排:支持Chain和Grapher两张编排模式。 生态集成:支持OpenAI,ARK、Allama,Qwen等多种大模型。 高性能:基于Go,天然支持高并发场景。 易扩展:清晰的接口设计,方便自定义组件。 简单使用 go package main import ( "context" "fmt" "log" "os" "github.com/cloudwego/eino-ext/components/model/deepseek" "github.com/cloudwego/eino/schema" ) func main() { ctx := context.Background() //创建模型 model, err := deepseek.NewChatModel(ctx, &deepseek.ChatModelConfig{ APIKey: os.Geten....

Eino简单学习

Technology
B+树索引结构与算法实现详解 目录 概述 B+树理论基础 MySQL中的B+树实现原理 节点结构设计原理 核心算法实现详解 分裂与合并机制 查询优化策略 并发控制机制 代码实现逐步解析 性能分析与优化 故障诊断与调试 概述 B+树是现代数据库系统中最重要的索引结构,几乎所有主流数据库(MySQL、PostgreSQL、Oracle等)都采用B+树作为主要索引实现。本文档将深入解析B+树的理论基础、设计原理、算法实现,并详细分析我们系统中的具体实现代码。 为什么选择B+树? 磁盘友好:B+树的设计完美适配磁盘的块存储特性 范围查询优化:叶子节点的链表结构支持高效范围查询 平衡性保证:自平衡特性确保查询性能的稳定性 高扇出比:减少树的高度,降低磁盘IO次数 缓存友好:内部节点可以完全缓存在内存中 B+树理论基础 1. B+树与其他数据结构的对比 B+树 vs B树 B树特点: ┌─────────────────────────────────────────────┐ │ 内部节点既存储键也存储值 │ │ ┌───┬───┬───┐ │ │ │ K1│V1 │K2│V2│K3│V3│ │....
有更新!

B+树索引结构与算法实现详解

Technology
我们可以在Go语言中十分便捷地开启goroutine去并发地执行任务,但是如何有效的处理并发过程中的错误则是一个很棘手的问题,本文介绍了一些处理并发错误的方法。 recover goroutine中的panic 我们知道可以在代码中使用 recover 来会恢复程序中意想不到的 panic,而 panic 只会触发当前 goroutine 中的 defer 操作。 例如在下面的示例代码中,无法在 main 函数中 recover 另一个goroutine中引发的 panic。 func f1() { defer func() { if e := recover(); e != nil { fmt.Printf("recover panic:%v\n", e) } }() // 开启一个goroutine执行任务 go func() { fmt.Println("in goroutine....") // 只能触发当前goroutine中的defer panic("panic in goroutine") }() time.Sleep(time.Second) fmt.Println("....
有更新!

Go并发错误处理

Technology
摘要:本文将深入探讨Go语言中桥梁模式的精妙实现,揭示如何通过接口与结构体分离抽象与实现,解决多维扩展难题。文章包含专业理论解析、高质量代码示例。
有更新!

深入剖析Go桥梁模式:解耦抽象与实现的架构艺术

Technology
切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合。切片的设计想法是由动态数组概念而来,为了开发者可以更加方便的使一个数据结构可以自动增加和减少。但是切片本身并不是动态数据或者数组指针。切片常见的操作有 reslice、append、copy。与此同时,切片还具有可索引,可迭代的优秀特性。
有更新!

深入解析Go中Slice底层实现

Technology
在计算机学中,反射式编程 reflective programming 或反射 reflection,是指计算机程序在运行时 runtime 可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。 Wikipedia: In computer science, reflective programming or reflection is the ability of a process to examine, introspect, and modify its own structure and behavior. 在类型检测严格的面向对象的编程语言如 Java 中,一般需要在编译期间对程序中需要调用的对象的具体类型、接口(interface)、字段(fields)和方法的合法性进行检查。反射技术则允许将对需要调用的对象的消息检查工作从编译期间推迟到运行期间再现场执行。这样一来,可以在编译期间先不明确目标对象的接口(interface)名称、字段(fields),即对象的成员变量、可用方法,然后在运行根据目标对象自身的消....

Go reflection 实践

Technology
Golang 中的 Channel 是一个强大且灵活的工具,能够有效解决并发编程中的多种问题。通过简化 Goroutine 之间的通信,提供数据安全性和同步机制,Channel 成为 Go 语言并发编程中不可或缺的一部分。无论是在处理复杂的并发任务,还是在构建高效的应用程序时,掌握 Channel 的使用都是至关重要的。

Go Channel底层实现

Technology
接口是高级语言中的一个规约,是一组方法签名的集合。Go 的 interface 是非侵入式的,具体类型实现 interface 不需要在语法上显式的声明,只需要具体类型的方法集合是 interface 方法集合的超集,就表示该类实现了这一 interface。编译器在编译时会进行 interface 校验。interface 和具体类型不同,它不能实现具体逻辑,也不能定义字段。 在 Go 语言中,interface 和函数一样,都是“第一公民”。interface 可以用在任何使用变量的地方。可以作为结构体内的字段,可以作为函数的形参和返回值,可以作为其他 interface 定义的内嵌字段。interface 在大型项目中常常用来解耦。在层与层之间用 interface 进行抽象和解耦。由于 Go interface 非侵入的设计,使得抽象出来的代码特别简洁,这也符合 Go 语言设计之初的哲学。除了解耦以外,还有一个非常重要的应用,就是利用 interface 实现伪泛型。利用空的 interface 作为函数或者方法参数能够用在需要泛型的场景里。

Go interface底层实现

Technology
1
RSS 开始使用
wangzhaoo - 记录精彩的程序人生

分类

Technology    
14 文章
0 浏览     2 当前访客
© 2026 wangzhaoo 的个人博客