自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(164)
  • 收藏
  • 关注

原创 Go 模块命令关系实验

这个实验用代码和隔离缓存观察go rungo buildgo get分别做了什么。实验在.lab中创建嵌套模块, 不会修改仓库根目录的go.mod和go.sum。

2026-07-09 16:23:18 210

原创 Go 网络库小白全景教程:从 io.Reader 到 net/http、JSON、连接复用和超时

1. http.Client 接收 *http.Request2. Client 处理 cookie、redirect、timeout3. Client 调用 Transport.RoundTrip4. Transport 从连接池找空闲连接,没有就用 net.Dialer 建 TCP 连接5. HTTPS 时进行 TLS 握手6. Transport 把 Request 写到连接7. 服务端 http.Server 从连接读出请求。

2026-07-05 12:55:50 378

原创 Go 单例模式:饿汉、懒汉和 sync.Once

很多人学单例模式时,会先想到“一个类只能创建一个对象”。但在 Go 里没有 class,也不太追求 Java 那种绝对封死的单例。因为 Go 里大写开头的标识符才能被包外访问,小写开头不能被包外直接访问。能保证里面的初始化函数只执行一次,即使多个 goroutine 同时调用也没问题。比如数据库连接池,不希望每次用的时候都重新创建一个连接池,而是全局复用同一个。Go 里的单例不要硬套“类 + 私有构造函数”的思路。单例模式的目标是:整个程序运行期间,某个对象只创建一份。是包级变量,包初始化时就创建好了。

2026-07-03 17:44:14 224

原创 一文搞懂 YAML 和 JSON:对象、数组、类型坑,以及 Go 中怎么用

JSON 和 YAML 表达的数据结构很像,但写法和适用场景不同。JSON 的对象用 {},数组用 []。YAML 的对象用缩进,数组用 -。Go 里对象通常用 struct,数组通常用 slice。JSON 适合接口传输。YAML 适合配置文件。配置解析时尽量用结构体,不要全靠 map[string]any。配置文件清晰结构体字段明确tag 写完整错误处理认真重要配置开启严格检查敏感信息不要明文输出。

2026-07-03 12:43:34 203

原创 Go context 入门:从取消、超时到请求链路传值

函数作用创建根 context临时占位 context创建可手动取消的 context创建超时自动取消的 context创建到指定时间取消的 context创建携带值的 context错误值含义被手动取消超时或超过截止时间context不是用来保存一堆业务参数的,也不是用来强行杀死 goroutine 的。这次任务什么时候结束?是否已经被取消?有没有超时?请求链路里有没有 request_id、trace_id 这种信息?context.WithCancel() // 手动取消。

2026-07-03 11:32:01 395

原创 Go 反射入门:概念、应用场景与 JSON 序列化原理

平时写 Go 代码,大多数类型信息在编译期就确定了。Age intu 是 Useru 有 Name 字段u 有 Age 字段Name 是 stringAge 是 intu.Nameu.Agev 可能是 Userv 可能是 Productv 可能是 []intv 可能是 map[string]stringv 也可能是 nilv.Name因为any不保证有Name字段。你到底是什么类型?你是什么种类?你有哪些字段?字段值是多少?字段上有没有 tag?能不能修改?

2026-07-02 15:32:02 326

原创 Go 文件处理入门:读写文件、目录遍历和路径操作

Go 标准库已经提供了完整工具。这篇文章会从最常见的场景开始,一步一步讲清楚 Go 文件处理。

2026-07-02 10:26:03 176

原创 Go 错误处理机制详解:新手从 err != nil 到 errors.Is/As

if err!= nil {return err// 只有没有错误时,才继续使用 value。调用函数检查错误如果有错误,处理或返回如果没有错误,继续执行Go 希望错误路径是显式的。显式的好处是:你能清楚看到每一步可能失败你能在失败处补充上下文你能决定是重试、忽略、返回、记录日志,还是终止程序代码不会突然跳到远处的 catch 块错误处理是正常业务流程的一部分。当错误不只是一个字符串,而是需要携带结构化信息时,可以定义自己的错误类型。

2026-06-30 14:16:56 314

原创 Go 语言 interface 入门:从隐式实现到实战设计

类型不需要声明自己实现了哪个接口。只要方法对得上,编译器就认为它实现了接口。ID intDogCatRobot是完全不同的类型,但它们都有方法,所以都可以当作Speaker使用。调用方可以依赖行为,而不是依赖具体类型。这是 Go 接口设计里很重要的一点。在很多语言里,接口常常由实现方定义。然后业务层被迫依赖这个大接口。由使用方定义它需要的最小接口。这样实现方只要提供这一个方法,就能被业务层使用。函数参数可以接收接口,让调用方更灵活。函数返回值优先返回具体类型,让调用方拿到更明确的能力。

2026-06-30 13:07:44 190

原创 Go 并发入门:从 goroutine、channel 到工作池

Go 的并发模型很适合写清楚的任务协作代码。goroutine用来并发执行任务。WaitGroup用来等待一组 goroutine 结束。channel用来在 goroutine 之间传递数据。close用来告诉接收方不会再有新数据。select用来同时等待多个 channel 操作。Mutex用来保护共享变量。-race可以帮助发现数据竞争。工作池可以限制并发数量,让大量任务更可控。并发程序首先要正确,其次才是快。不要为了“看起来高级”而滥用 goroutine。能用简单同步写清楚,就先写清楚;

2026-06-30 12:50:41 241

原创 Go 语言 fmt 与 log 打印方式详解

除了使用全局的,也可以创建自己的 logger。import ("log""os"log.Newlog.New(输出位置, 日志前缀, 日志格式)fmt解决的是“怎么格式化输出”的问题。log解决的是“怎么记录日志”的问题。fmt.Println(value) // 简单打印fmt.Printf("%+v\n", structVal) // 调试结构体fmt.Sprintf("id=%d", id) // 生成字符串。

2026-06-30 10:31:33 222

原创 Go 泛型入门:从类型参数到泛型链表

有时候内置的any和comparable不够。比如你想写一个Minfunc Min[T???if a < b {return areturn b这里需要使用。但不是所有类型都能用。if a < b {return areturn bif a < b {return areturn b102.71go这里的T可以是这些类型之一。前面的表示允许底层类型是这个类型的自定义类型。Age的底层类型是int。int那Age不一定能匹配。~int那Age就可以匹配。这就是。

2026-06-27 20:15:57 337

原创 Go 里的 struct:没有 class,也能写出优雅的对象世界

Go语言通过struct实现面向对象编程,但与传统class体系不同。struct仅定义数据字段,方法通过receiver绑定到外部。Go强调组合而非继承,使用嵌入字段实现代码复用。接口通过隐式实现提供多态能力,只需方法匹配即可。封装通过首字母大小写控制可见性,构造函数采用普通函数形式。Go的设计理念是:数据与行为分离,小接口优先,零值可用,组合优于继承。这种轻量级面向对象方式让代码更清晰直接,减少了传统OOP的复杂性。

2026-06-27 18:42:39 337

原创 Go 数组与切片:从固定长度到灵活视图

数组是固定长度的值类型,赋值和传参都会复制整个数组。切片是对底层数组的一段引用,包含指针、长度和容量。切片最重要的易错点是:多个切片可能共享同一个底层数组,修改一个切片可能影响另一个。需要独立数据时,用。

2026-06-27 08:24:52 229

原创 Go 新手入门:一篇文章讲清楚 go.mod 文件

go.mod是 Go 项目的模块说明书。声明当前模块是谁声明当前模块需要哪个 Go 版本声明当前模块依赖哪些模块和版本声明依赖解析时有哪些替换、排除、工具和忽略规则module 决定导入路径前缀go 决定最低 Go 版本和工具行为require 记录依赖replace 用于本地调试或临时替换go mod tidy 负责整理依赖就已经能应付绝大多数 Go 项目了。

2026-06-25 19:04:42 405

原创 Go 语言 package 入门:从目录、包名到导入路径

一个目录通常就是一个包同目录下的普通 .go 文件 package 名要一致文件名不需要和包名一样导入路径由 go.mod 的 module 名加子目录决定调用时使用的是 package 声明的包名大写开头的名字才能被其他包访问把这几条记住,Go 的包、模块、导入路径和可见性基本就打通了。后面再遇到internalreplace、多模块工程时,也能顺着这套逻辑理解。

2026-06-25 17:01:36 363

原创 提示词编写技巧

编写合理且有效的提示词,是我们与 AI 进行有效对话的第一步,好的提示词能显著提升模型输出的质量和相关性。宗旨就是:将你的问题限定范围,让 AI 知道你要的答案具体要包含什么,提示词效果会大幅提升。核心在于换位思考:想象 AI 对你提供的信息一无所知,你需要清晰、具体、无歧义地告诉它你要什么、在什么背景下、以什么方式呈现。善用示例、角色扮演、具体约束和迭代优化。提示技巧不止一种,掌握多种技巧,并根据不同任务灵活组合使用,才是成为提示词高手的秘诀。

2026-05-08 16:28:42 361

原创 redolog和binlog的刷新

全程基于 InnoDB 引擎、MySQL 默认的两阶段提交(2PC)机制,结合你之前学的 binlog cache、redo log buffer,把每个动作的先后顺序、写入时机讲死,避免混淆。

2026-04-22 15:27:08 166

原创 数据库事务

事务是一组不可分割的数据库操作集合,是数据库执行的最小逻辑工作单元。事务内的所有操作,要么全部执行成功,要么全部执行失败回滚,不存在 “部分成功、部分失败” 的中间状态。隔离性指多个并发执行的事务之间,是相互隔离、互不干扰的,一个事务的内部操作和中间状态,对其他事务不可见,每个事务都感觉不到其他事务在并发执行。持久性指一个事务一旦提交成功,它对数据库的修改就会永久保存到磁盘中,后续的任何操作、服务器宕机、断电、系统崩溃,都不会导致这次提交的修改丢失。

2026-04-22 15:13:45 361

原创 数据库索引介绍

索引是,索引对应的列值作为该结构中的,用于快速定位数据行。常见的索引底层结构主要有和ORDER BYGROUP BY。

2026-04-22 14:17:42 307

原创 Cookie 与 Session 超详细讲解

每次请求都是独立的,服务器根本记不住 “你是谁”,刚登录完再发请求,服务器就不认识你了。为了,才出现了这套标准方案。

2026-04-22 13:22:34 505

原创 数据库分页

将符合查询条件的海量结果集,按照固定条数拆分为多个「页」,每次仅查询并返回其中一页的数据,而非一次性返回全部数据。拆分结果、按需查询、分批返回放弃offset偏移量,记录上一页最后一条数据的唯一有序标识(书签),下一页直接通过索引定位到书签位置,跳过所有前序数据,不做任何无效扫描。有序、唯一、带索引(推荐id或小数据量 / 前几页:直接用普通 LIMIT,简单高效;后台系统、需要跳页:选延迟关联,兼顾性能 + 跳页;移动端 APP、下拉加载:选书签游标,性能极致;超海量数据。

2026-04-22 11:36:12 371

原创 HTTP/1.0 / HTTP/1.1 / HTTP/2.0 超详细全维度对比

HTTP协议发展历程摘要:HTTP/1.0(1996)是最基础版本,采用短连接和纯文本传输,性能极差。HTTP/1.1(1997)成为主流协议,引入长连接、管道化和完善的缓存机制,但仍存在队头阻塞和头部冗余问题。HTTP/2.0(2015)是高性能协议,采用二进制分帧、多路复用和HPACK头部压缩,彻底解决HTTP层队头阻塞,并支持服务端推送。三版本核心差异在于连接方式(短/长/单)、传输格式(文本/二进制)、并发机制(串行/管道化/多路复用)和头部处理(无压缩/HPACK)。HTTP/2虽优化性能,但TC

2026-04-22 11:00:08 362

原创 Http的referer字段

Referer是HTTP 请求头中的一个字段,作用是告诉服务器:当前这个请求,是从哪个网页 / URL 发起的。

2026-04-21 19:43:55 602

原创 如何加速TCP传输大文件

2026-04-21 18:13:17 90

原创 跨站请求伪造(CSRF)

同源策略(Same-Origin Policy,SOP)它是谁制定的?→浏览器(仅浏览器有,服务器 / 操作系统没有)它管谁?→ 仅限制网页里的 JavaScript 脚本核心目的→ 防止恶意网站偷偷窃取你的登录信息、Cookie、页面数据核心规则同源可自由读写,跨源只许发请求、不许读数据判断两个网址是否同源,只看 3 个东西缺一不可协议域名baidu.comhack.com端口(:80 / :443,默认端口可省略)✅同源示例和(协议、域名、端口全一致)❌跨源示例(全部不同源)和(协议不同)

2026-04-21 12:04:08 514

原创 DNS 完整解析 + 全类型 DNS 劫持原理

通过篡改 DNS 解析流程中的任意环节,破坏域名与真实 IP 的映射关系,将用户重定向至恶意 / 指定 IP的行为,分为 ** 主动劫持(无入侵,管理员配置)和。

2026-04-21 11:21:09 445

原创 【无标题】

核心目的:动态给对象加功能,替代多层继承,避免类爆炸核心结构:抽象组件 → 具体组件 → 抽象装饰器 → 具体装饰器核心动作层层包裹、动态扩展、不修改原类核心思想组合优于继承一句话记忆不改变原件,动态套壳加功能,想套几层套几层。

2026-04-17 13:49:31 377

原创 观察者模式讲解

核心:一对多依赖,状态自动广播通知角色:抽象主题 + 具体主题 + 抽象观察者 + 具体观察者流程:订阅 → 状态变 → 通知 → 更新核心价值:解耦、开闭原则、动态扩展一句话记忆你关注我,我变了就告诉你,不用我挨个找你。

2026-04-17 13:41:52 361

原创 工厂设计模式

工厂生产「产品族」,而不是单个产品。产品族:一组相关 / 相互依赖的产品(如华为工厂生产:华为手机 + 华为电脑)一个抽象工厂可以创建多个不同类型的产品本质:封装new过程,解耦创建与使用简单工厂:入门版,适合小场景,违反开闭工厂方法:标准版,最常用,完美遵循开闭抽象工厂:高级版,适合多产品族,约束性强所有工厂模式的共同优点降低代码耦合统一对象创建逻辑便于维护和扩展隐藏对象初始化细节。

2026-04-17 13:30:41 423

原创 LLM根据上文预测下文过程

本文展示了基于Transformer架构的文本生成全过程。以输入"我现在饿了想吃"为例,模型通过7个步骤处理:1)分词与词嵌入将文本转换为7个3维向量;2)位置编码注入语序信息;3)层归一化稳定数值分布;4)自注意力机制计算token间语义关联;5)前馈神经网络进行非线性变换;6)线性投影得到候选词得分;7)Softmax转换概率分布并解码输出。最终模型预测下一个词为"饭"(概率14.5%),符合"饿了想吃"的语义逻辑。整个过程展示了如何从原始文本

2026-04-05 12:05:48 532

原创 机器学习三大核心分支全解

机器学习三大核心范式对比 监督学习:依赖标注数据,学习输入到输出的映射关系,适用于分类和回归任务。优势是目标明确、效果可量化,但依赖高质量标注数据。典型算法包括SVM、XGBoost和CNN等。 无监督学习:利用无标签数据自主挖掘隐藏规律,适用于聚类、降维和生成任务。优势是不需标注数据,但效果难以评估。代表算法有K-Means、PCA和GAN等。 强化学习:通过环境交互和奖惩机制学习最优决策序列,适合游戏AI、自动驾驶等动态场景。优势是能解决连续决策问题,但训练难度大、成本高。主流算法包括DQN和PPO等。

2026-04-05 09:42:16 1002

原创 传统机器学习(浅层模型)vs 深度学习(深度神经网络)

传统机器学习是机器学习的基础流派,核心是基于人工设计的特征,用浅层结构的模型,学习特征与结果之间的映射关系。这里的「浅层」,不是指模型只有 1 层,而是模型只有 1-2 层可学习的参数层,无法自动从原始数据中提取层级化的特征,所有特征表达必须由人工提前设计完成。深度学习是机器学习的一个子集,核心是由多层可学习的非线性变换层堆叠而成的深度神经网络,能够自动从原始数据中完成层级化的特征提取,实现端到端学习,完全摆脱对人工特征工程的依赖。这里的「深度」,核心是层级化的特征学习能力。

2026-04-05 09:35:23 921

原创 Read和Write再网络中的返回值详解

read的返回值、write的返回值

2026-01-26 21:41:57 710

原创 C++Any的介绍与实现

C++17Any的使用介绍与实现

2026-01-26 21:31:47 548

原创 timefd

timefd、linux的定时器

2026-01-25 16:06:18 545

原创 C++11的线程池

线程池手写 ,线程池实现异步素数计算

2026-01-21 09:21:24 263

原创 invoke_result | result_of | 类型的判断与修改

类型萃取、invoke_result,result_of,类型判断、类型修改、改造类型、条件类型的选择

2026-01-20 12:44:48 1106

原创 强类型枚举 | static_assert | tuple

强类型枚举 , static_assert , tuple

2026-01-20 08:43:24 982

原创 auto | 尾置返回类型 | decltype | using | typedef

auto 、尾置返回类型 、 decltype 、 using 、 typedef

2026-01-19 22:04:53 902

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除