- 博客(79)
- 收藏
- 关注
原创 Python 函数参数的语法
语法含义传入方式出现位置要求param普通参数位置或关键字任意默认参数可省略必须在普通位置参数之后*args可变位置参数位置在所有位置/普通参数之后**kwargs可变关键字参数关键字必须放在最后param, /仅限位置参数只能位置/ 之前*, param仅限关键字参数只能关键字* 或 *args 之后掌握了上面这些,Python 函数参数你就已经完全吃透了!以后写库、框架、装饰器时就能随心所欲了。需要我再给你一些实际项目中常见的写法案例吗?
2025-12-03 11:37:02
208
原创 FastAPI 的 BackgroundTasks 在异常情况下不会执行
摘要:FastAPI 的 BackgroundTasks 存在一个隐蔽缺陷——当应用抛出异常时,后台任务会被静默丢弃且无任何提示。官方文档未明确说明此行为,导致开发者容易在生产环境中踩坑。测试表明,无论是 HTTPException、未处理异常还是中间件捕获的异常,所有后台任务均不执行,与开发者预期严重不符。复现代码显示,即使中间件处理了异常并尝试添加任务,这些任务仍会被丢弃。该问题源于文档描述不完整,亟待官方澄清或修复。
2025-12-02 11:00:23
231
原创 OpenTelemetry Go 库中的 trace 核心代码 分析
const (定义了追踪系统中可能出现的错误类型,用于标识非法的 trace ID 和 span ID。
2025-10-19 00:36:47
357
原创 OTLP gRPC 追踪导出器客户端源码分析
本文档分析了 OpenTelemetry 项目中 OTLP (OpenTelemetry Protocol) gRPC 追踪导出器客户端的实现源码。该客户端负责通过 gRPC 协议将追踪数据发送到远程 OTLP 收集器。var (架构清晰:模块化设计,职责分离并发安全:完善的锁机制和状态管理容错性强:全面的错误处理和重试机制性能优化:最小锁竞争和高效资源管理可观测性:内置监控和度量收集标准兼容:遵循 OpenTelemetry 协议规范。
2025-10-19 00:23:30
684
原创 Go 语言函数设计原则:避免修改传入参数
Go 语言函数设计应遵循"不可变输入"原则,避免修改传入参数。这一专业实践体现了:1)函数纯净性,确保相同输入产生相同输出;2)减少副作用,防止意外修改调用者数据;3)提升可维护性,使调试更简单;4)增强并发安全性。标准库如time.Add和strings.ToUpper均采用此模式。专业API应明确创建新对象而非修改原对象,这对框架设计和大型系统开发尤为重要,是区分开发水平的关键标准。
2025-07-26 15:10:52
308
原创 极简分支风格
摘要:极简分支风格是一种结构化编程方法,核心通过"早返回"原则实现代码简化。其特点包括:每个分支单次返回、避免深层嵌套、禁用goto等跳转语句、变量作用域最小化、辅助函数内联处理异常流。典型实现中,主流程保持线性向下,异常情况通过前置条件检查提前退出。该风格显著提升代码可读性,降低维护成本,便于测试扩展,尤其适合业务逻辑清晰的场景。在Go语言中,常表现为handler函数只做流程粘合,业务逻辑交由聚合器处理。
2025-07-08 00:24:18
176
原创 grom 事务 RowsAffected 踩坑记录
摘要:在使用GORM事务时,发现直接检查事务对象tx的RowsAffected会得到不正确的结果。原因是RowsAffected属于具体操作返回的DB实例而非全局事务对象。正确的做法是将Create操作结果赋值给变量dbResult,然后通过dbResult.RowsAffected获取实际影响行数。修改后的代码能正确判断插入操作是否生效。
2025-07-05 23:37:21
277
原创 小明的GORM结构体标签魔法书
《GORM标签魔法指南》摘要:本文以魔法比喻讲解GORM结构体标签的用法。基础篇介绍主键(primaryKey)、唯一值(unique)、索引(index)等认证类标签,以及字段尺寸控制(size/type)和时间自动填充(autoCreateTime)功能。高级篇涵盖非空校验(not null)、默认值(default)、JSON序列化(serializer)等特性,并演示表关联的"外键召唤术"(foreignKey)。通过游戏角色等生动代码示例,展示如何像施法一样组合多种标签实现数据
2025-05-26 22:26:12
321
原创 不停机数据库迁移方案
这个东西, 主要利用一些工具, 比如 gorm 的 conn pool 这种工具, 利用这种装饰器模式封装两个数据源, 每次执行语句的时候, 根据标记位来执行对应的双写逻辑。将原来的表的数据给迁移过去, 这一步我们可以借助 mysqldump 这种工具, 直接把数据迁移过去, 下面一部就是执行一次校验。双写校验+ 增量校验: 也就是一边进行双写, 然后一边进行增量校验, 主要还是根据对应的 uptime 来做这个件事情。第一次校验的方式主要有两种,
2025-02-24 00:36:18
394
原创 数据库迁移的几个概念
增量校验这种校验方式只对数据集中新增或者修改的部分进行校验。它通常基于某种时间戳、版本号或者其他标识来确定哪些数据是需要校验的。例如,在一个数据库系统中,可以利用更新时间字段来标记最近被更新的记录,并且只对这些记录进行校验。全量校验是指对数据集中的所有记录进行完整的校验。这不考虑数据是否被修改,而是检查整个数据集的完整性、正确性等。例如,审计过程中对一个财务数据系统进行全面的数据一致性检查,就需要对所有账目记录进行全量校验。二、校验粒度增量校验校验的粒度相对较小,因为它只针对特定的部分数据。
2025-02-22 11:23:17
496
原创 什么是数据库代理
数据库代理是现代分布式系统中关键的“智能流量管理器”,通过解耦应用与数据库的直连依赖,显著提升了系统的可扩展性、稳定性和可维护性。选择适合的代理方案时,需结合业务规模、数据库类型及运维复杂度综合评估。数据库代理(DB Proxy)是一种位于应用程序和数据库服务器之间的中间件,充当两者之间的“中间人”。如AWS RDS Proxy、阿里云数据库代理,帮助用户管理云数据库的连接和扩展。每个微服务通过代理访问数据库,避免直连导致的配置分散和资源竞争。通过代理实现数据隔离,动态路由不同租户的请求到独立数据库实例。
2025-02-04 23:23:29
1152
原创 深入理解MySQL 的 索引
B+ 树索引由根页面(Root)、分支页面(Branch)和叶子页面(Leaf)组成一棵树的结构。InnoDB 中,索引页面的大小由参数 innodb_page_size 控制,默认为 16K。: innoDB 对行的长度有一定的限制,每行记录的长度不能超过页面大小的一半。索引是一种用来快速检索数据的一种结构, 索引使用的好不好关系到对应的数据库性能方面, 这篇文章我们就来详细的介绍一下数据库的索引。在上面中我指定了对应的 primary key 为对应的 id 字段, 所以Id 就作为对应的默认索引,
2025-01-31 23:58:18
533
1
原创 QPS 值是怎样进行计算和应用的
QPS(Queries Per Second),即每秒查询率,指一台服务器每秒能够相应 的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。它表示系统在某一特定时间内能够处理的查询请求的数量,通常用于衡量 Web 服务器、数据库等系统的性能。
2025-01-30 19:27:59
1773
原创 如何使用DDD 的思想规划对应的模块
DDD 也就是所谓的领域驱动设计, 强调设计对应的领域模型, 然后将对应的领域模型和我们的代码相关联, 这样可以构建一个防腐层, 来隔离我们的变化。
2025-01-26 21:48:36
399
原创 面试时、我把Go 的 chan 源码分析给面试官看
在 Go 语言并发编程中,“不要通过共享内存来通信,而应该通过通信来共享内存”是其核心理念之一。这句话体现了 Go 语言并发模型的设计哲学,即通过通信机制(如 channel)来实现数据共享,而不是直接操作共享内存。
2025-01-26 17:29:55
963
原创 字节一面, Go语言的Map 的扩容机制是怎样的?
在 Go 语言中,map 是一种内置的数据结构,用于存储键值对。它基于哈希表实现,具有高效的查找、插入和删除操作。当 map 中的元素数量不断增加时,为了保证操作的高效性,Go 语言的 map 会触发扩容机制。以下是关于 Go 语言 map 扩容机制的简单介绍。
2025-01-24 19:56:46
1307
原创 Kafka 源码分析(一) 日志段
关于这个LogSegment 是存在与之相关的方法的, 主要有三个方法, 分别是对应的 append 方法, read 方法, 以及对应的 recover 方法。和日志段相关的第三个操作是 recover 函数,在消息系统中, 日志被分成了多个日志段, 每个日志段包含一定数量的消息,这些日志消息被保存在磁盘上面,recover 方法的作用是确保在 Broker 启动时,能够正确地从磁盘加载日志段数据,并将其恢复到一个一致的状态,以便后续的读写操作能够正常进行。首先我们看一下对应的append 函数。
2025-01-21 14:12:15
768
原创 Go Map 源码分析(一)
当 map 处于扩容阶段,定位 key 到某个 bucket 后,需确保该 bucket 对应的老 bucket 已完成迁移,即老 bucket 中的 key 都已迁移到新 bucket(老bucket中的key会被分散到两个新bucket),之后才能在新bucket中进行插入或更新操作。bmap结构体:是哈希表中的桶,每个bmap能够存储8个键值对,并且设有一个指针,当某个bmap存满时,就会申请新的bmap进行存储,并与前一个bmap构成链表。因为扩容之后,key 的分 布发生了变化。
2025-01-19 22:54:14
869
3
原创 Go 语言的slice是如何扩容的?
Go 语言中的 slice 是一种灵活、动态的视图,是对底层数组的抽象。当对 slice 进行追加元素等操作导致其长度超过容量时,就会发生扩容。
2025-01-18 20:04:26
1024
原创 C 语言的void*到底是什么?
通过我们上面的介绍, 我们发现void*第一个方案就是作为结构体的字段, 这样我们可以去表示对应的范型字段函数的参数, 或者返回值, 但是我觉得这种最好少用, 因为导致对应的接口不够明确各种内存相关的函数, 这其实就是一个很奇妙的东西, 因为在操作系统级别, 我们并不知道这块内存到底是什么类型的变量约定: 当我们在使用void*的时候, 我们最好弄清楚当前这个指针指向的信息, 可以通过明确的变量名来完成。
2025-01-17 09:29:43
3056
3
原创 defer 源码分析
在 deferreturn 函数的最后,会使用 jmpdefer 跳转到之前被 defered 的函数,这时控制权从 runtime 转移到了用户自定义的函数。在Go 语言中多个 defer 形成一个链表. defer 语句会首先调用一个 defer proc 函数, new 一个对应的结构体挂载到对应的G 上面调用new 之前会从 G 所绑定的 P 的 defer pool 里面取, 没有取到会从全局的defer pool里取, 实在没有的话才新建一个。
2025-01-02 10:33:25
320
原创 ssh 设置持久化连接
修改/etc/ssh/sshd_config文件,找到【ClientAliveInterval 0】和【ClientAliveCountMax 3】,并将注释符号【#】去掉。将ClientAliveInterval对应的【0】改为【60】,ClientAliveCountMax使用默认值【3】即可。【ClientAliveInterval 60】表示每分钟发送一次,客户端响应后,即可保持长连接。ClientAliveCountMax表示云服务器发出请求后,客户端响应的次数没有达到一定值,就会自动断开
2024-12-21 14:51:10
805
原创 设计模式之 abstract factory
对应的一个产品, 我们可以通过抽象工厂搞出来的两个东西。首先client这个东西可以接触到三个接口, 分别是。首先创建一个工厂接口。
2024-12-20 17:09:58
615
原创 js表达式的结果
的引用, 然后它可以作为下一个操作符号, 例如函数调用符号的左手端来使用, 于是有了对象方法调用运算。delete 其实只能删除一种引用, 即对象的成员。的属性时候, 那么就需要从当前环境中找到一个名为。看作一个表达式, 并尝试删除它的求值结果。这个引用就可以了, 而当它不是全局对象。, 就称为不同环境下绑定的标识符或名字。的引用, 找到这两种不同的引用。这个引用不存在, 所以会报一个。), 而是删除一种引用。
2023-01-02 13:45:02
210
原创 MySQL游记
我们根据条件来查询表中的内容,而条件就是where语句,这个where就相当于其它的语言中的if语句。在MySQL中最重要的就是表的概念。
2022-10-31 21:57:29
167
原创 js中this的指向
函数作为构造函数调用时候, 在js中没有类的概念, 创建对象是用构造函数来完成。中没有类的概念, 创建对象是使用构造函数来完成或者直接使用json格式来写对象。指向, 不管函数位于哪一个位置, 只要关注函数调用的位置。,准确的说this为null, 但是被解释成。函数.call(对象, 参数1, 参数2)指向方法的调用者, 即该对象。作为对象的方法来调用,
2022-10-18 21:58:42
96
原创 初探七层网络协议
进入下一层mac层,主要是与网关相关的东西, 首先操作系统默在启动的时候,DHCP通信协议配置客户端IP地址以及默认的的网关IP地址192.168.1.1,进入下一层,传输层,面向传输的TCP协议,面向对象的UDP协议,存储的信息有两个,一个是浏览器监听的端口,另一个服务器监听的端口。首先是应用层,这个层主要是HTTP协议,将要发送的数据内容进行封装。操作系统通过ARP协议将IP地址发送给网关,网关的地址叫MAC地址。进入下一层, 网络层,主要是本地浏览器的地址,和服务器的地址。
2022-10-01 08:55:42
699
原创 【Git】删除文件(转载)
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本。这个时候, git知道你删除了文件, 因此,工作区域和版本库就不一致了,一般情况, 你通常在文件管理器中把没有用的文件删了,或者使用rm命令删了。先添加一个新的文件test.txt到Git并且提交。在Git中,删除文件也是一个修改操作。现在,文件就从版本库中被删除了。命令会告诉你哪些文件被删除了。
2022-09-06 16:20:02
2682
原创 【C/C++】C语言程序执行过程
通过链接处理,编译器会将所有程序目前需要的对象文件进行整合,设置好程序中所有调用函数的正确地址,并生成对应的二进制文件可执行文件。编译器会分析和优化源代码,并将其编译成对应的汇编格式代码,这部分代码中含有使用汇编指令描述的原始 C 程序逻辑。编译器会首先移除源代码中的所有注释信息,并处理所有宏指令。其中包括进行宏展开、宏替换,以及条件编译等。编译器会将这些汇编代码编译成具有一定格式,可以被操作系统使用的某种对象文件格式。
2022-09-03 14:40:47
457
原创 【C/C++】函数指针
来获取,注意(*print_ptr)一定要写在圆括号的里面,否则函数参数。上面例子中,变量print_ptr是一个函数指针,它指向函数。由上面的结论我们就可以得出下面几种函数调用的方式。有了函数指针,通过它也可以调用函数。本文摘录自阮一峰的C语言教程。
2022-09-03 13:37:09
312
原创 【编译原理】编译器前端
首先构造根节点,代表整个程序,之后向下扫描 Token 串,构建它的子节点, 当它看到一个 int 类型的 Token 时,知道这儿遇到了一个变量声明语句,于是建立一个“变量声明”节点;最后,遇到“字面量”其值是 45。这棵树叫做抽象语法树, AST,树木的每一个节点是一个语法单元, 形成ast之后的好处就是,让计算机很容易去处理,一种非常直观的构造思路是自上而下进行分析。编译器的下一个阶段是语法分析,语法分析是在词法分析的基础上面识别出程序的语法结构,这个结构就是一个树状结构,是计算机容易理解和执行的。
2022-08-23 17:21:31
1194
原创 【PHP】构造函数和析构函数
将会把数据传送给构造方法, 然后构造方法用参数来影响对象, 然后返回给对象。析构函数在对象销毁的时候执行,销毁对象对象的方式有这样几种,当对象在创建的时候,将会自动调用构造方法。, 在PHP中构造方法不可以进行重载。
2022-08-20 19:43:39
163
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅