- 博客(547)
- 收藏
- 关注
原创 Gorm散知识点小结(二)--Where(“1 = 1”)
报错 “WHERE conditions required” 不是 bug,而是 GORM 的。不是 GORM 的语法糖,而是 SQL 动态拼接时的“安全垫片”——显式整表执行,千万别仅仅为了“让代码跑通”而盲目写。不写就代表“全表”或“按主键默认排序”取数据。c) 用模型方式更新(自带主键 WHERE)绕开保护,或者给 GORM 一个恒真条件。都为空时,最终 SQL 会变成。,GORM 会直接拒绝执行并返回。它从来不是前置必要条件。要么给出真实条件,要么用。a) 加任意真正过滤条件。
2025-11-15 16:46:04
285
原创 Gorm(十四)的多条件叠加
只要方法签名返回的还是*gorm.DB且没真正发 SQL,就会继续往同一个Statement里写条件。想隔离就或新建会话,或者把链式调用拆成局部变量。真正执行的那一步(FindCreateUpdateDeleteCount…)会把当前 Statement 消费掉,之后再用原指针也不会污染。
2025-11-11 23:23:55
658
原创 Go切片的赋值
同类型切片(如[]byte赋值给[]byte清空方式影响a自身的指向或长度,b是否受影响取决于a是否与b仍共享底层数组(重新赋值为空切片时b不变,截断长度时b也不变)。不同类型切片(如[]byte转换为[]string转换过程会产生数据拷贝,两者完全独立,清空a对b无任何影响。核心原因:Go 切片的赋值是“引用传递”(共享底层数组),但不同类型间的转换是“值传递”(拷贝数据),这决定了后续操作的影响范围。
2025-10-30 22:47:27
372
原创 Go语言中json.RawMessage
本质上是[]byte但它实现了和接口,因此在 JSON 处理时会被特殊对待——序列化时直接输出原始字节,反序列化时直接保存原始 JSON 字节而不解析。的核心价值是保留 JSON 原始字节,延迟或手动控制解析动态 JSON 结构(字段类型不固定)。嵌套 JSON 的直接嵌入。避免循环引用或复杂结构的自动解析问题。通过它可以灵活处理 JSON 序列化/反序列化的细节,尤其在处理不确定结构的 JSON 数据时非常实用。
2025-10-30 22:44:36
341
原创 go操作xml
XML 保存:使用或序列化结构体,再写入文件或处理字符串。xml.Name类型:包含Space(命名空间)和Local(元素名)两个字段,用于定义 XML 元素的名称和命名空间。赋值方式:可直接初始化结构体,或通过标签指定(推荐,更简洁)。
2025-10-30 22:42:10
501
原创 Gorm散知识点小结--标签名
若要让字段映射到数据库,必须首字母大写(保证可见性)。未指定column标签时,GORM 自动将驼峰式字段名转为蛇形列名(全小写,单词间下划线分隔)。首字母小写的字段会被 GORM 忽略,不会参与数据库交互。
2025-10-30 22:41:18
173
原创 Gorm(十二)乐观锁和悲观锁
乐观锁:通过版本号实现无锁并发,适合低冲突场景,需手动处理冲突。悲观锁:通过FOR UPDATE锁定记录,适合高冲突场景,需控制事务时长。Context:控制操作超时和取消,避免资源泄漏,是所有场景的基础保障。根据业务的冲突频率和性能需求选择锁机制,并结合Context确保系统的健壮性。
2025-10-26 21:36:15
254
原创 Gorm(十一)事务
手动事务:显式控制BeginCommitRollback,适合复杂逻辑和中间判断。自动事务:通过自动管理事务,简化代码,适合简单场景。嵌套事务:基于保存点实现,支持子事务局部回滚,适合复杂业务中部分步骤可失败的场景。根据业务复杂度和灵活性需求选择合适的事务方式,核心目标是保证数据操作的原子性。
2025-10-26 21:34:21
348
原创 Gorm(十)计数 / 存在性
高效统计关联数据的数量,适合只需计数的场景。:批量查询关联数据的具体记录,适合按需加载关联详情。二者均通过批量查询避免 N+1 问题,且支持条件过滤,是处理关联关系的高效工具。根据是否需要具体关联数据选择对应方法,可在保证性能的同时满足业务需求。
2025-10-26 21:32:00
461
原创 Gorm(九)嵌套预加载、带条件预加载(防止 N+1)
嵌套预加载:通过批量加载多层关联数据,每层仅 1 条 SQL,解决多层 N+1 问题。带条件预加载:通过where或匿名函数筛选关联数据,减少无效加载,同时保持批量查询的高效性。二者结合使用,可在复杂关联场景中兼顾性能和数据准确性,是 Gorm 关联查询的最佳实践。
2025-10-26 21:30:46
384
原创 Gorm(八)预加载方式
PreloadPreload:通过多条 SQL 预加载关联数据,适合所有关联类型,避免主表重复,支持嵌套和条件过滤。Joins:通过单条联表 SQL 查询,适合一对一或需过滤主表的场景,注意一对多的记录重复问题。根据关联类型和查询需求选择合适的方法,可兼顾性能和代码清晰度。
2025-10-26 21:29:15
525
原创 Gorm(七)关联的Tag写法
关联定义:通过foreignKeyreferencesmany2many等标签定义一对一、一对多、多对多关系,明确外键和中间表。关联操作Append:添加关联,保留现有数据。Replace:替换关联,删除现有数据。Delete:移除部分关联,保留其他数据。合理使用关联标签和方法,可高效处理复杂的关联关系。
2025-10-26 21:27:39
345
原创 Gorm(六)错误处理 & RowsAffected
错误处理:通过检查判断操作是否异常,区分特定错误类型(如),确保程序稳定。:通过受影响的行数判断操作是否实际生效(如更新是否命中记录、删除是否成功),是业务逻辑判断的重要依据。二者结合使用,可全面掌控数据库操作的结果,保证业务逻辑的正确性和程序的健壮性。
2025-10-26 20:10:31
461
原创 Gorm(五)钩子实践
钩子函数(自动填充时间、ID 等元数据;数据校验(如检查字段合法性);关联操作(如创建主记录时同步创建子记录)。合理使用钩子能大幅减少重复代码,确保数据操作的一致性和规范性。
2025-10-26 20:08:25
465
原创 Gorm(四)删除操作
物理删除(Delete):彻底删除记录,适用于无保留需求的场景。软删除(依赖):逻辑标记删除,保留数据,默认查询不可见。Unscoped:用于查询软删除记录或强制物理删除已标记的记录。根据业务对数据保留的需求选择合适的删除方式,软删除更适合需要数据追溯或恢复能力的场景。加粗样式。
2025-10-26 20:05:48
506
原创 Gorm(二)Gorm创建方法
Create用于单条插入,用于批量插入,适合纯新增场景。Upsert)用于“存在则更新,不存在则插入”的场景,需结合唯一索引或主键判断冲突,灵活处理重复数据。根据业务需求选择合适的方法,可高效处理数据插入与冲突问题。
2025-10-26 20:00:17
545
原创 Gorm(一)查询方法
/ 定义自定义结构体(与查询结果字段匹配)Age int// 查询结果映射到 UserNameAgeScope 是一个接收*gorm.DB并返回*gorm.DB// 定义“成年用户”的 Scope// 定义“分页”的 Scope用WhereOrNot定义条件;用FirstFind等指定返回条数(单条/批量);用SelectOrderLimit等控制字段、排序和分页;用CountPluck处理统计和字段提取;用Scopes复用查询逻辑。
2025-10-26 19:55:16
783
原创 go build -tags的其他用法
若想临时编译一个可执行文件到当前目录(如测试),用go build -tags <标签>;若想将程序安装到全局路径方便长期使用,用go install -tags <标签>;两者的-tags作用完全一样,仅命令的输出位置和用途不同。
2025-10-21 23:07:49
446
原创 全缓冲和行缓冲
缓冲区被填满(达到缓冲区大小)后,才会将数据刷新到硬件;此外,主动调用刷新函数或关闭流时,也会触发刷新。当输入/输出遇到“换行符\n”时,触发数据刷新;此外,缓冲区满、主动刷新、关闭流等条件也会触发刷新。全缓冲:填充满才刷新,用于磁盘文件,追求效率;行缓冲:遇\n刷新,用于stdoutstdin,追求交互即时性;缓冲模式可通过setvbuf手动修改,刷新可通过fflush主动触发。理解这两种缓冲模式,能避免开发中常见的“I/O 延迟”问题(如printf。
2025-09-28 21:37:18
782
原创 c程序调试命令
ltrace是 Linux 系统中一款强大的调试工具,用于跟踪程序调用的和,并打印函数的参数和返回值。它类似于strace,但更专注于用户态的库函数调用(如 C 标准库函数printfmalloc等)。strace:跟踪进程的系统调用(如openread)和信号,用于调试IO问题。
2025-09-27 19:52:31
357
原创 linux环境下搭建stm32工程
如果一切顺利,你将在 build/ 目录下看到生成的 my_stm32_app.elf, my_stm32_app.hex, 和 my_stm32_app.bin 文件。假设你已下载并解压了固件库,解压后的路径为 STM32F10x_StdPeriph_Lib_V3.5.0。这会创建一个包含源文件 (src)、头文件 (inc)、库文件 (lib) 等的清晰结构。第 1 步:安装交叉编译工具链。第 2 步:创建工程目录结构。第 4 步:创建关键工程文件。第 3 步:拷贝固件库文件。第 5 步:编译工程。
2025-09-10 00:13:51
472
原创 nm命令和nm -D命令参数
nm看不到符号 → 常规符号表被剥离(不影响动态链接)。nm -D能看到符号 → 动态符号表正常(足够动态链接使用)。这是动态库优化后的正常现象,无需担心功能问题。
2025-08-13 23:24:41
1016
原创 在nvim的snippet补全片段中增加函数注释的功能
同理,如果想在其他语言进行同样的补全的话,在对应语言的snippets中增加以上代码即可。我当前补全的是c语言所以使用的片段是c.snippets。
2025-04-09 23:33:34
445
原创 c++编译动态库,go语言进行调用报不存在函数定义错误
函数名前后增加Z15等字符是C++名称修饰的结果。使用extern "C"可以避免名称修饰,方便在动态库中直接通过原始函数名调用。使用nm命令可以查看动态库中的符号,帮助确认函数名的变化。
2025-03-21 07:01:11
336
原创 git bundle创建和复制分支的方法
git bundle是一个非常实用的 Git 工具,它允许你将一个 Git 仓库的提交历史打包成一个单独的文件,方便在没有网络连接或者不方便直接克隆仓库的情况下传输和分享代码。以下是git bundle常见使用场景及对应的实例。
2025-03-17 22:25:35
1028
原创 go回调函数的使用
在Go语言中,回调函数可以有参数,也可以没有参数。它们的定义和使用方式略有不同,但本质上都是将函数作为参数传递给另一个函数,并在适当的时候调用它。以下是带参数和不带参数的回调函数的示例和说明。无论是带参数还是不带参数的回调函数,都可以使用匿名函数来实现。匿名函数可以在调用时直接定义,而不需要提前声明。带参数的回调函数可以传递数据给回调函数,使其更加灵活。不带参数的回调函数是最简单的形式,通常用于简单的事件处理或状态通知。通过合理使用回调函数,可以实现更灵活的代码结构和更高效的程序设计。
2025-03-14 22:56:02
751
原创 go中实现子模块调用main包中函数的方法
推荐方法:将共享逻辑提取到独立的包中,避免循环依赖。替代方法:使用回调函数传递逻辑,避免直接导入main包。在实际开发中,尽量避免在子模块中直接调用main包的逻辑,这样可以保持代码的清晰性和模块化。
2025-03-14 22:12:43
688
原创 git subtree在本地合并子仓库到主仓库
以上是几种补充的合并方法,每种方法都有其适用场景和优缺点。如果需要保留历史记录,可以使用的--rejoin或。如果只需要当前状态,可以使用或手动复制文件。如果需要选择性合并提交,可以使用git rebase或。如果需要更灵活的工作环境,可以使用。希望这些方法能帮助你更灵活地完成子仓库到主仓库的合并!
2025-03-13 00:23:37
1419
原创 转和git subtree管理方式为git submodule的管理方式
通过以上步骤,你可以将 Git 子树转换为子模块,从而更灵活地管理依赖关系。找到当前项目中子树的路径以及对应的远程仓库地址。例如,假设子树的路径为。,对应的远程仓库地址为。
2025-03-10 23:08:03
495
原创 git worktree的使用
是 Git 提供的一个强大功能,允许你在同一个仓库中同时创建多个工作目录,每个目录对应一个分支,从而实现并行开发。以下是。
2025-03-10 20:43:56
1157
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅