Golang设计模式之简单工厂模式

简单工厂模式概述简单工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在这种模式中,一个工厂类负责创建其他类的实例,并且封装实例的创建逻辑。这种模式让类的实例化推迟到子类进行。 为什么需要简单工厂模式在没有工厂模式的情况下,如果需要创建多种类型的对象,可能会导致一个类中包含大量条件判断语句,这不仅增加了代码的复杂性,也违反了单一职责原则和开闭原则。 简
阅读全文

RAG优化

RAG概述RAG,即"RetrievalAugmented Generation",是一种结合了检索(Retrieval)和生成(Generation)的机器学习模型框架。它广泛应用于自然语言处理任务,如文本生成和问答系统等。RAG模型首先通过检索机制从大型文档集合中检索出与输入查询最相关的文档或文档片段,然后利用这些信息作为上下文,输入到生成模型中,以生成响应或完成特定的语言任务。RA
阅读全文

使用docker-compose构建本地lamp开发环境

使用使用 Docker 和 项目在 Windows 上搭建一个 LAMP 开发环境,将本地的 PHP 项目、MySQL映射到 Docker 服务器上。 前置条件1. Docker Desktop: 请确保已在 Windows 上安装并运行最新版的 Docker Desktop。2. Git: 需要安装 Git 来克隆代码库。 步骤 1. 克隆 LAMP 项目
阅读全文

sync.map底层原理

一、`sync.Map` 的设计哲学在 Go 中,对一个普通的 `map` 进行并发读写操作是不安全的,会导致程序 panic。常规的解决方案是使用互斥锁 `sync.Mutex` 或读写锁 `sync.RWMutex` 来保护 `map`。```go// 使用读写锁保护mapvar mu sync.RWMutexm := make(mapint)// 写
阅读全文

Go语言之 sync.Once

`sync.Once` 是 `sync` 包下的一个组件,它保证某些操作只会被执行一次,无论有多少个 goroutine 调用它。常见的使用场景包括初始化操作,确保某段代码(如初始化函数)只执行一次。关键思想:通过原子操作和内存屏障的配合,确保在多线程环境下某些操作只会执行一次。 基本使用`sync.Once` 使用起来非常简单,只需要调用 `Do` 方法,传入一个无参无返回值
阅读全文

Go语言之 sync.Pool

`sync.Pool` 是 `sync` 包下的一个组件,可以作为保存临时取还对象的一个“池子”,可以缓存暂时不用的对象,下次需要时直接使用(无需重新分配)。因为频繁的内存分配和回收会对性能产生影响,通过复用临时对象可以避免该问题。适用场景:当多个 goroutine 都需要创建同一个对象时,如果 goroutine 数过多,导致对象的创建数目剧增,进而导致 GC
阅读全文

Go语言的内存对齐

关于内存对齐内存对齐,即字节对齐,指代码编译后在内存的布局与使用方式。现代计算机多为32位或64位地址对齐,若变量内存未对齐,可能触发总线错误。 为什么需要内存对齐CPU访问内存是以字长为单位,而非逐个字节。例如32位CPU,字长为4字节,其访问内存单位也是4字节。这种设计旨在减少CPU访问内存次数,提升访问吞吐量。若不进行内存对齐,会增加CPU访问内存次数,降低性能。同
阅读全文

Golang sync.Cond

在并发编程中,协调多个协程之间的操作是一项常见的需求。条件变量(Condition Variable)是用于解决多个协程之间复杂协调问题的一种机制。条件变量配合互斥锁(`Mutex`)使用,可以让一组协程等待某个条件成立后再继续进行,而不会一直消耗 CPU 资源进行忙等待。本文将详细介绍 Golang 中 `sync` 包提供的 `Cond` 类型,并通过示例代码展示如何使用 `Cond`
阅读全文

Go内存逃逸分析

基本概念逃逸分析(Escape analysis)是由编译器决定内存分配位置的一种技术,不需要程序员明确指定。函数中申请一个新对象时,编译器决定该对象是分配在栈中还是堆中: 如果分配在栈中,函数执行结束后内存会自动回收。 如果分配在堆中,函数执行结束后内存会交给GC(垃圾回收)处理。有了逃逸分析,返回函数局部变量变得可能,这与闭包息息相关。了解哪些场景下对象会逃逸至关
阅读全文

Go垃圾回收机制

前言垃圾即为不再需要的内存块。如果这些垃圾不清理,无法再次被分配使用。在不支持垃圾回收(GC)的编程语言中,这些垃圾内存就会泄露。Golang的垃圾回收也是内存管理的一部分。了解垃圾回收,最好先了解内存分配原理。 垃圾回收算法业界常见的垃圾回收算法有以下几种: 引用计数维护每个对象的引用计数,当引用该对象的对象被销毁时,引用计数减1。当引用计数为0时,回收
阅读全文