C++20 模块化详解💡 C++20 模块(Modules)是 C++ 语言自诞生以来对「头文件机制」最大的一次重构,目标是:更快的编译速度、更清晰的接口边界、更强的封装性。
1. 为什么需要模块?在 C++20 之前,我们用 #include + 头文件 来组织代码:
每个 .cpp 包含同样的头文件时,编译器会重复解析所有内容
复杂的 #include 链条导致编译依赖非常脆弱,一点改动就会触发大量重编译
宏和实现细节会污染全局命名空间,容易出现命名冲突
模块的核心目标:
一次编译,多处复用:接口单独编译成二进制描述,后续 import 直接复用
边界清晰:显式导出需要暴露的符号,默认实现细节对外不可见
减少宏污染:模块内部宏不会泄漏到使用者
显著提升编译速度:大工程中可实现 2–5 倍的整体编译提速
2. 模块的基本概念与文件结构2.1 模块单元(Module Unit)一个模块由若干个「模块单元」组成,常见类型:
主模块接口单元(Primary Interface Unit):模块对外暴露的主入口
模块实现单元(Module Implementati ...
📚 导读
了解为什么要关注 C++17 的 std::filesystem 和并行算法
快速掌握常用 API 与并行执行策略
通过实战示例感受“文件系统 + 并行”的威力
📌 一、为什么要关心 C++17 的这两部分?在 C++17 之前,标准库对 文件系统操作 和 并行计算 支持都比较薄弱:
操作文件和目录通常依赖平台 API(如 POSIX、Win32)或 Boost.Filesystem。
想利用多核 CPU,往往要手写线程池或使用第三方库。
C++17 引入了两块关键能力:
std::filesystem:跨平台的标准文件系统库。
std::execution 并行算法:在熟悉的 <algorithm> 基础上,通过执行策略轻松启用并行。
这两者结合,可以很方便地写出“既能遍历磁盘、又能吃满多核 CPU”的实用程序。
📁 二、std::filesystem:现代 C++ 的文件系统库🔧 2.1 基本概念与命名空间概念讲解
头文件:<filesystem>
命名空间:std::filesystem(通常起个别名 fs ...
随着大语言模型(LLM)能力的飞速提升,AI 应用的开发已经从早期的“调用 API 即可”演变成了一项复杂的系统工程。在这个过程中,LangChain 和它衍生出的 LangGraph 成为了开发者手中不可或缺的利器。但面对这两个名字相似的框架,许多开发者会陷入困惑:我到底该用哪一个?它们之间是替代关系还是互补关系?
本文将为你全景解析这两大框架的核心机制、适用场景,并提供一份最终的选型避坑指南。
这是一篇为您量身定制的博客文章,基于您的《全景解析与选择指南(理论与对比篇)》大纲,并结合了相关的技术细节进行了深度扩充。
一、 引言:大模型应用开发的演进与挑战1. 原生大模型 API 的痛点在 AI 应用开发的初期,我们通常直接调用 OpenAI 或 DeepSeek 等原生模型的 API,进行简单的一问一答。然而,当我们将大模型嵌入到复杂的业务系统中时,很快就会遇到瓶颈:
缺乏私有知识: 模型只知道训练时的数据,无法回答企业内部或实时的信息(例如幻觉问题严重)。
非结构化输出难题: 业务系统通常需要结构化的数据(如 JSON),而 LLM 默认输出自然语言,难以直接对接程序接口。 ...
1. 数组(Array)基本特性
固定长度:数组长度在编译期确定,是类型的一部分
值类型:数组赋值和传参会发生完整拷贝
连续内存:元素在内存中连续存储,访问效率 O(1)
代码示例1234567891011121314151617181920212223package mainimport "fmt"func main() { // 声明并初始化 var arr1 [5]int // 零值初始化:[0 0 0 0 0] arr2 := [3]int{1, 2, 3} arr3 := [...]int{1, 2, 3, 4} // 编译器推导长度 // 数组是值类型 arr4 := arr2 arr4[0] = 100 fmt.Println(arr2) // [1 2 3] - 原数组不变 fmt.Println(arr4) // [100 2 3] // 多维数组 matrix := [2][3]int{ ...
编程语言
未读1. 为什么要使用 goroutine在实际开发里,你经常会遇到这类需求:
同时处理很多 IO(HTTP 请求、数据库、文件、消息队列)。
把一个大任务拆成多个子任务并发执行(批处理、爬虫、转码)。
后端服务需要同时处理大量连接与请求。
传统做法通常是“一个任务一个线程”。但 OS 线程创建、切换的成本较高,线程数也不可能无限增长。
goroutine 的意义:用更轻量的并发执行单元,把并发写成“语言层面的常规代码”,并交给 Go runtime 调度。
2. 进程、线程、并发与并行(先把概念对齐)
进程(Process):程序在操作系统中的一次执行过程,是资源分配与调度的基本单位。每个进程有独立的地址空间。
线程(Thread):进程内的执行单元,是程序执行的最小单位。一个进程可以包含多个线程。
并发(Concurrency):多个任务在同一段时间内交替推进,强调“组织与调度”。单核 CPU 上多任务通常体现为并发。
并行(Parallelism):多个任务在同一时刻真正同时执行,强调“硬件多核 + 调度”。多核 CPU 上更容易实现并行。
用一句话理解:
并 ...
“go”
“编程语言”tags:
gocoverImage: “photo-1642367340318-96fdbc5d30f5-scaled.jpg”
Go 语言特点与优势Go(又称 Golang)是 Google 于 2009 年推出的开源编程语言,由 Robert Griesemer、Rob Pike 和 Ken Thompson 设计。
核心特点1. 简洁高效
语法简洁,关键字仅 25 个
编译速度极快,接近解释型语言的开发效率
代码可读性强,易于维护
2. 原生并发支持
内置 goroutine(轻量级线程)
channel 实现优雅的并发通信
单机可轻松支持数万并发
3. 垃圾回收
自动内存管理,无需手动释放
GC 性能持续优化,停顿时间极短
4. 静态类型 + 类型推断
编译期类型检查,减少运行时错误
支持类型推断,减少冗余代码
5. 丰富的标准库
网络、HTTP、JSON、加密等开箱即用
跨平台支持(Windows/Linux/macOS)
6. 部署简单
编译生成单一可执行文件
无需依赖外 ...
一、 引言:为什么我们需要 LangChain?在刚接触大语言模型(LLM)开发时,很多人觉得写个 API 请求就万事大吉了。然而,随着业务深入,原生大模型开发的四大痛点会迅速浮现:
产生幻觉:简单的提示词往往无法约束模型,导致它在没有知识储备时“一本正经地胡说八道”。
输出非结构化:模型天生喜欢输出自然语言的对话,但我们的代码接口(如前端渲染或数据库插入)通常需要严格的 JSON 格式,两者难以直接对接。
知识陈旧且缺乏实时性:模型只停留在训练数据的截止日期前,不知道今天的天气,也不知道公司昨天刚发布的内部文件。
缺乏行动力:原生大模型是一个“被锁在小黑屋里的高智商大脑”,无法主动联网搜索、操作计算器或读写数据库。
LangChain 的破局之道在于其“积木化”的设计哲学。它将复杂的自然语言处理(NLP)流程拆解为一系列标准化的组件(如语言模型、提示词模板、输出解析器、检索器等)。借助 LangChain,开发者可以像搭积木一样自由组合这些组件,高效定制出强大且稳定的工作流。
二、 核心基石:Runnable 接口与 LCEL 语法要搞懂 LangChain,就必须理解 ...
🐬 MySQL 存储过程、触发器与 SQL 编程实战指南
服务端集中处理示意
📌 阅读导航
关系型数据库示意图
🧮 存储过程 = 把一段业务逻辑搬进数据库
一、存储过程(Stored Procedure) 🧮1.1 什么是存储过程存储过程是一组为了完成特定业务功能的 SQL 语句集合,经编译后存储在数据库服务器端,用户只需要通过
12CALL 存储过程名(参数列表);CALL 存储过程名(参数列表);
即可执行内部的一系列 SQL 操作,并得到结果。
可以理解为:把复杂的 SQL 逻辑写在数据库里,封装成一个“函数”供外部调用。
1.2 存储过程的特点1.3 存储过程的优缺点
1.4 存储过程语法在命令行中书写存储过程时,需要临时修改语句结束符,否则过程体中的分号会被误认为语句结束:
12345678910111213141516171819202122232425262728293031323334353637383940-- 1. 修改结束符为 //DELIMITER //-- 2. 创建存储过程CREATE PROCEDURE 存储过程名 (参数列表)B ...
🚀 为什么需要学Vue3?Vue3是目前最流行的前端框架之一,学习它有以下几个重要原因:
1. 市场需求旺盛
国内大厂(阿里、腾讯、字节跳动等)广泛使用Vue3
招聘市场对Vue3开发者需求量大,薪资待遇优厚
中小企业也普遍采用Vue技术栈
2. 学习曲线友好
中文文档完善,对中国开发者友好
渐进式框架设计,可以逐步深入学习
社区活跃,学习资源丰富
3. 开发效率高
组合式API提高代码复用性
响应式系统自动更新UI,无需手动操作DOM
丰富的生态系统(Vue Router、Pinia、Element Plus等)
4. 性能优秀
虚拟DOM优化,渲染速度快
按需编译,打包体积小
支持Tree-shaking,减少冗余代码
5. 职业发展
掌握Vue3可以开发企业级应用
为学习React、Angular等框架打下基础
可以转向全栈开发(配合Node.js)
💡 Vue3技术为什么会诞生?理解Vue3的诞生背景,有助于我们更好地掌握它的设计理念和核心特性。
Vue2遇到的瓶颈在Vue3诞生之前,Vue2已经非常成熟并被广泛使用。但随 ...
前言在刚学习编程的时候,我们总是会将自己做的一些小玩具迫不及待地分享给我们的朋友,但是在那时我们的还没程序打包的概念,经常做出来的程序,要么只能在 Visual Studio(特定的环境里面)中跑起来(第一个分享给是有的是一个简单的猜数字游戏,但是在室友的电脑上是中运行不起来,后看来才知道原来是mac电脑上不能直接运行.exe程序 )。
在刚知道qt的时候瞬间就觉得他非常的有趣,从而开始幻想自己有一天要做出一些让朋友对我竖起大拇指的项目 😏。终于前些时间,我制作的第一个较大项目完成了,今时不同往日现在我是时候来好好琢磨琢磨,怎么让朋友们也能玩到这个耗费我大量心血的玩具 😊
概述本教程将详细介绍如何在Windows系统下将Qt应用程序打包成可独立运行的程序,并进一步制作成专业的安装包。整个流程分为三个主要步骤:环境准备 → 依赖打包 → 安装包制作。
💡 核心工具
一、前期准备1.1 Qt环境变量配置在使用windeployqt工具前,需要确保Qt相关路径已添加到系统环境变量中。
步骤:
找到自己的 QT安装路径
点开可能会有多个目录,这取决于你在下载Qt时的安装设置,具 ...


