- 博客(52)
- 收藏
- 关注
原创 Git使用和理解上的一些问题
Git分支与文件状态关系解析 未提交修改的跨分支现象: 新增/删除文件未提交时,修改仅存在于工作区/暂存区 切换分支时Git会保留这些不属于任何分支历史的修改 导致其他分支也会看到这些临时变更 文件暂存后的分支隔离: 将文件提交到暂存区后,修改与当前分支绑定 切换分支时Git会用目标分支状态覆盖工作区 导致其他分支不再显示这些已绑定的修改 暂存区的工作机制: 工作区是所有分支共享的物理目录 暂存区(index)与当前分支绑定,独立维护 切换分支时会替换暂存区内容为目标分支状态 确保各分支开发环境隔离,避免临
2025-08-16 11:05:05
1047
原创 Go语言中切片(Slice)的拷贝
Go语言中切片拷贝分为浅拷贝和浅拷贝两种方式:浅拷贝(如直接赋值或切片截取)仅复制切片结构,新旧切片共享底层数组,修改会相互影响;深拷贝(如copy函数或手动遍历)会创建新数组,完全独立。使用copy(s1,s2)时只会覆盖s1中与s2长度相当的部分元素。切片截取后的长度等于终止索引减起始索引,容量等于原容量减起始索引。根据需求选择拷贝方式,避免共享数据带来的副作用。
2025-08-10 20:35:45
757
原创 GC探究(1)
Go语言内存优化与回收机制分析 减少批量内存分配如何降低写屏障压力 减少批量内存分配可显著降低Go语言写屏障压力,主要原因有三方面:首先,写屏障作为GC的核心机制,每次指针写操作都会产生额外指令和缓存开销;其次,批量分配导致短生命周期对象增多,增加GC频率和写屏障执行次数;最后,通过对象复用、控制堆增长和逃逸分析优化,可减少指针操作次数,降低GC触发频率。基准测试显示对象复用可使内存分配次数从1000次降至1次,大幅减少写屏障触发。 Go 1.18+的激进内存回收机制 Go 1.18+实现了更激进的内存回收
2025-07-26 15:09:22
677
原创 GO语言中的垃圾回收(GC)
Go语言GC机制从1.3到1.18版本经历了显著优化。早期版本(1.3前)采用标记-清除算法,需全局STW暂停;1.3-1.5引入并发清除;1.5-1.7实现并发标记+Dijkstra写屏障,STW降至10ms;1.8采用混合写屏障,STW缩短到亚毫秒级;1.18+引入增量GC和Pacer机制,动态调整GC触发时机。GC流程包括:触发准备、初始STW(标记根对象)、并发标记(增量执行)、最终STW(确认标记)、并发清除和恢复阶段。通过版本迭代,Go实现了从秒级到毫秒级的STW优化,显著提升了性能表现。
2025-07-14 08:38:57
1120
原创 TCP流量控制与拥塞控制:核心机制与区别
摘要: TCP通过流量控制和拥塞控制协同保障数据传输效率。流量控制采用滑动窗口协议,接收方动态反馈缓冲区容量,解决端到端速率匹配问题,避免接收方溢出。拥塞控制基于慢开始、拥塞避免、快重传和快恢复四阶段算法,通过调整拥塞窗口(cwnd)应对网络负载,防止全局拥塞。两者区别在于:流量控制关注接收方处理能力(窗口字段调节),而拥塞控制管理网络路径状态(cwnd动态调整)。典型场景如APP通信需流量控制,多用户下载时依赖拥塞控制。三次重复ACK触发快重传的设计平衡了丢包检测效率与误判风险。
2025-06-22 21:27:40
951
原创 怎么优化MySQL中的索引
MySQL索引优化关键策略包括:合理选择高选择性列创建索引,优先使用复合索引并遵循最左前缀原则;通过覆盖索引减少数据访问,定期清理冗余索引;注意避免函数计算、隐式转换等导致索引失效的情况;结合EXPLAIN分析查询计划,监控索引使用效率;定期维护索引统计信息,平衡读写性能需求;针对大表可考虑分区和前缀索引等高级优化。优化核心在于索引设计、查询匹配和定期维护的协同配合。
2025-06-15 21:39:46
1554
原创 grpc和http的区别
摘要: gRPC和HTTP是两种主要的通信协议,各有特点。HTTP基于文本(如JSON/XML),兼容性强,适合Web开发;gRPC基于HTTP/2和二进制协议(Protobuf),性能更高,支持流式通信,适合微服务等高性能场景。HTTP采用RESTful风格,接口灵活;gRPC通过.proto定义服务,自动生成代码,开发更高效。gRPC适合内部系统,HTTP更适用于公开API。选择时需权衡性能、兼容性及具体场景需求。
2025-06-08 21:11:12
1333
原创 DDD架构
领域驱动设计(DDD)是一种聚焦业务复杂性的软件设计方法,其核心是通过领域建模将业务逻辑与技术实现解耦。关键概念包括:领域模型(业务抽象)、限界上下文(模型边界)、聚合根(数据一致性单元)、实体/值对象(领域对象分类)。采用分层架构(用户界面层、应用层、领域层、基础设施层)实现关注点分离。DDD尤其适用于ERP、金融系统等业务逻辑复杂的场景,能提升系统可理解性、可维护性和扩展性,但需要团队具备较强的领域建模能力。该方法通过业务与技术的高度协同,有效应对复杂系统的开发挑战。
2025-06-01 17:42:24
1157
原创 http和https
HTTP与HTTPS的核心区别在于安全性:HTTP传输明文数据,易受攻击;HTTPS通过SSL/TLS加密数据并验证服务器身份,使用443端口和数字证书。HTTPS虽性能略低但更安全,已成为主流协议。其证书工作原理涉及加密传输(结合非对称/对称加密)和身份验证(CA颁发的证书链),需经过申请、验证、安装等流程,包含DV/OV/EV等类型。随着技术进步,HTTPS在保护敏感数据和提升SEO方面优势显著,建议所有网站逐步迁移。
2025-05-25 19:45:27
1585
原创 TCP的三次握手和四次挥手
TCP协议通过三次握手和四次挥手机制确保连接的可靠建立和释放。三次握手过程中,客户端和服务器通过交换SYN和ACK报文段确认双方的发送和接收能力,防止无效连接请求。四次挥手则通过FIN和ACK报文段确保数据传输的完整性,避免连接被错误关闭。客户端和服务器在完成数据传输后,分别发送结束请求和确认报文段,最终安全关闭连接。这些机制保证了TCP连接的可靠性和数据传输的完整性。
2025-05-11 22:40:24
1244
原创 redis中的hash
Redis 在 5.0 新设计一个数据结构叫 listpack,目的是替代压缩列表,它最大特点是 listpack 中每个节点不再包含前一个节点的长度了,压缩列表每个节点正因为需要保存前一个节点的长度字段,就会有连锁更新的隐患.listpack 也叫紧凑列表,它的特点就是用一块连续的内存空间来紧凑地保存数据,同时为了节省内存空间,listpack 列表项使用了多种编码方式,来表示不同长度的数据,这些数据包括整数和字符串。
2025-04-07 17:35:17
1017
原创 redis中的set
Redis 的 intset 升级机制是一种灵活且高效的内存管理策略,能够在插入超出当前编码范围的元素时自动调整编码方式,确保数据结构的紧凑性和操作的高效性。
2025-04-07 17:14:14
707
原创 框架、云原生、微服务的基本概念
单一架构是一种将所有功能集成到一个单一的、大型的应用程序中的架构方式。这种架构通常是一个独立的进程,包含了应用的所有模块和功能。垂直架构是将应用按照功能模块划分为多个独立的子系统,每个子系统负责特定的业务功能,但仍然部署在同一台服务器上。这种架构是单一架构的扩展,通过模块化解决了部分可维护性问题。分布式架构是将应用拆分为多个独立的服务,每个服务负责特定的业务功能,并且可以独立部署在不同的服务器或容器中。服务之间通过网络通信(如HTTP、gRPC、消息队列等)进行协作。
2025-03-10 17:06:14
1555
原创 Gorm中的First()、Create()、Update()、Delete()的错误处理
err 的值取决于插入操作失败的具体原因。常见的错误类型包括数据库约束违反、数据类型不匹配、连接问题等。你可以通过检查错误消息或使用 GORM 提供的工具(如 gorm.IsRecordNotFoundError)来处理这些错误。如果删除条件未匹配到任何记录,result2.Error 的值是 nil。如果需要判断是否删除了数据,可以通过检查 result2.RowsAffected 是否为 0 来实现。
2025-03-02 19:25:21
1246
原创 Redis过期数据处理
Redis 默认使用键的过期时间来进行数据过期处理,但也可以通过自定义过期策略来实现对过期数据的恢复。将过期键和其对应的值发布到一个频道中。使用一个订阅者来订阅这个频道,当有新的过期键被发布时,订阅者会接收到通知。在订阅者中实现自定义的逻辑来处理已过期的键,并执行相应的操作。
2025-02-23 21:56:36
1310
原创 Redis过期机制
以上函数中的rdb.Set(rdb.Context(), key, data, cacheDuration).Err()中的 cacheDuration一旦被设置,是不是就意味着,当数据在内存中存储超过这个时间,就会被删除,redis缓存中将不在有该数据了?是的,在 Redis 中,cacheDuration 设置为 24 * time.Hour 表示缓存数据的过期时间为 24 小时。
2025-02-16 21:10:17
694
原创 Go内存逃逸
在Go语言中,Go 程序会在 2 个地方为变量分配内存,一个是全局的堆(heap)空间用来动态分配内存,另一个是每个 goroutine 的栈(stack)空间。(Escape Analysis) 是指由编译器决定内存分配的位置,不需要程序员指定,由编译器完成,作用于编译阶段。
2025-02-06 14:54:12
787
原创 gorm中关于事务的一些东西
tx.Rollback() 后,事务会自动结束,事务对象tx 不再可用。回滚操作会撤销事务中所有未提交的更改,并将数据库状态恢复到事务开始之前的状态。通过正确使用tx.Rollback() 和 tx.Commit(),可以确保事务的正确管理和错误处理,从而保证数据的一致性和完整性。查询失败需要回滚:如果查询操作失败,应该调用 tx.Rollback() 回滚事务,以确保事务的完整性。事务未结束:如果查询失败后不调用 tx.Rollback(),事务仍然处于打开状态,但后续操作无法继续执行。
2025-01-25 21:50:36
1381
原创 路径参数和查询参数分别是什么
在Web开发中,路径参数(PathParameter)和查询参数(QueryParameter)是两种常见的从客户端传递数据到服务器的方式。它们的主要区别在于参数的传递方式和用途。
2025-01-19 19:45:28
705
原创 不可重复读和读脏数据的区别
不可重复读(Non-repeatable Read)和读脏数据(Dirty Read)是数据库事务隔离级别中常见的并发问题,它们描述了在并发事务的情况下,可能出现的数据不一致性。发生场景:事务1在修改数据后尚未提交,事务2读取了事务1修改的数据。事务1如果在提交前回滚,那么事务2读取的数据就变成了“脏数据”——因为它读取的是一个未提交的修改。:事务在两次读取同一数据时,数据的值发生了变化(即数据被其他事务修改了)。数据一致性受到影响,但不同于脏读,因为事务1读取的数据是已提交的数据。
2025-01-13 10:01:05
513
原创 数据库中的并发控制
一级封锁协议:不丢失修改,但不能保证不读脏数据和可重复读。二级封锁协议:可以避免脏读,并且不丢失修改,但不能保证可重复读。三级封锁协议:可以保证不丢失修改、不读脏数据并且保证可重复读。事务1获取数据 X 的锁,并开始读取数据。事务2修改了 X,但事务1仍然保持对 X 的锁,直到事务1完成并提交。事务1在整个过程中读取到的数据始终一致,无论其他事务是否对数据进行了修改。
2025-01-05 20:15:24
1512
原创 INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN这四个怎么在gorm中使用
在 GORM 中,JOIN 操作是通过 Joins 方法实现的,而不同类型的 JOIN(如 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN)可以通过特定的 SQL 语法来表示。解释:RIGHT JOIN 返回 orders 表中的所有记录,即使 users 表中没有匹配的 id,未匹配的用户信息用 NULL 填充。解释:Raw 允许你直接执行原始 SQL 查询,因此可以通过 FULL JOIN 语法来获取所有用户和订单,包括未匹配的记录。
2024-12-30 22:27:46
959
原创 http.ServeMux多路复用器的设置
简而言之,http.DefaultServeMux.ServeHTTP(w, r) 允许你的自定义 http.Handler 与全局的路由规则协同工作,确保所有的路由设置都能被正确地应用到传入的请求上。
2024-12-08 18:04:54
1175
原创 处理HTTP请求的两种常见方式:多个处理器(Handler)、多个处理函数(HandleFunc),两者有什么区别
在Go语言中,处理HTTP请求的两种常见方式是使用http.Handler接口和http.HandleFunc函数。它们都用于定义如何处理HTTP请求,但它们之间有一些关键的区别:1.http.Handler接口:2.http.HandleFunc函数:区别总结:http.Handler接口的优势在于它的灵活性和能够去封装状态和行为。以下是一些具体的例子来说明http.Handler接口的优势:1. 封装请求处理逻辑和状态使用http.Handler接口,你可以创建一个结构体来封装请求处理所需的状态
2024-12-01 20:43:03
1358
原创 Go无缓冲通道(同步通道)
goroutine1先执行,如果想要再次发送(写入)数据的话,必须等待goroutine2将channel中的数据取出来(读取)之后,才能再次发送。goroutine2先执行,如果想要再次接收数据的话,必须等待goroutine1再次向channel中写入数据之后,才能再次接收。同理,因为当程序执行到 v :=
2024-11-24 11:26:59
560
原创 简单分析数据被序列化后的内容
JSON 字符串是以UTF-8 编码的字节数组表示的。Go 的[]byte类型可以帮助我们逐个访问 JSON 字符串中的每个字节。通过解析字节数组,我们可以看到 JSON 的每个字符(包括汉字)如何被编码和存储。这行代码使用fmt.Printf格式化输出字节数组内容,按索引字节值字符表示三列对齐显示。通过 %-10d和 %-15q的格式控制,可以确保输出整齐,便于阅读和分析。%q格式化符号特别适合显示字符串和字符的字面值,同时处理 Unicode 和转义字符。
2024-11-17 11:44:11
785
原创 go语言中反射机制(3种使用场景)
JSON 解析:利用反射实现通用的结构体解析函数,动态处理不同类型的 JSON 数据。ORM 框架:使用反射将数据库结果映射到结构体字段,实现通用的数据库查询。接口适配:动态检查和调用方法,实现灵活的接口处理。这三个场景充分展示了 Go 语言中反射的强大功能,但同时也提醒我们反射可能带来的性能开销与复杂性,因此在实际开发中应当谨慎使用。
2024-11-17 11:15:31
894
原创 go语言中的反射机制(基础)
在实际使用中,如果想要通过反射修改变量的值,通常需要传递变量的指针。原因是 Go 语言中的函数参数是值传递,如果传递的是一个普通变量(如 int 或 string),反射操作无法直接修改原始值。当我们使用 reflect.ValueOf() 获取某个变量的 reflect.Value 时,可以使用 Kind() 方法来判断它的类型种类。在 Go 语言的反射机制中,reflect.Ptr 是一个常量,用于表示变量的。
2024-11-17 10:59:07
904
原创 闭包的知识
闭包是带有环境变量引用的函数,可以保存和使用创建时的上下文数据。这种特性使得闭包在需要记住函数状态、创建自定义函数工厂、计数器等场景中非常有用。闭包常用于创建不同配置的函数。我们可以在闭包中定义一部分行为,让函数调用者提供另一部分参数,从而实现定制化的功能。// filter 函数接收一个整数切片和一个闭包函数,用于过滤符合条件的元素if test(num) { // 调用闭包判断条件// 传递闭包函数来筛选出偶数})
2024-11-10 20:02:06
1257
原创 redis的持久化
Redis 的持久化机制主要是通过内部的方式来实现的,而不是直接将数据写入到外部数据库(如 MySQL)。下面将详细介绍 Redis 的默认持久化机制,以及如何通过编程的方式将 Redis 数据手动同步到 MySQL。
2024-11-03 23:17:50
1422
原创 sql语句中的Group By 分组查询
分组查询的主要目的是对数据进行分类汇总,以便从数据集中提取有意义的统计信息和分析结果。在 SQL 中,分组查询通常通过 GROUP BY 子句来实现,将数据按照某个字段(或字段组合)进行分组,然后对每个分组应用聚合函数(如 SUM()、AVG()、COUNT()、MAX()、MIN() 等)来计算统计值。
2024-10-26 16:28:39
4039
原创 输入缓冲区和换行符
输入流和输入缓冲区可以视为同一个东西的不同描述。当数据进入输入缓冲区时,我们说数据存在于输入流中,而程序通过读取输入缓冲区来获得用户的输入。在使用 fmt.Scan 时,换行符会被当作空白字符处理,并且会从输入流中消费掉,不会继续存在于输入流中。因此,在下一次读取时,换行符已经不再存在。
2024-10-24 23:35:18
970
原创 使用bufio.NewReader(os.Stdin)从标准输入(通常是键盘输入)读取数据
os.Stdin 代表标准输入,用于接收来自终端或命令行的输入。bufio.NewReader(os.Stdin) 创建了一个带有缓冲区的读取器,使读取数据更高效。reader.ReadString(‘\n’) 阻塞等待用户输入,直到按下回车键,然后返回输入的整行文本。os.Exit() 的参数用于指定程序的退出状态码,0 表示正常退出,非 0 表示异常退出。状态码可以用来区分不同的错误类型,是操作系统和脚本判断程序执行结果的依据。
2024-10-24 23:27:38
1053
原创 go语言中的Scan()和Scanln()输入函数
出现连续输出的问题是因为 fmt.Scan 在输入格式错误时,未能正确处理错误并清除输入缓冲区。通过添加错误处理和清除输入缓冲区的操作,可以避免这种情况的发生。
2024-10-24 23:22:00
893
原创 go语言中的Scanf()输入函数
fmt.Scanf 在读取数据时,换行符会导致输入解析中断,从而无法继续读取剩余的数据。fmt.Scanln 和 bufio.Reader 可以更好地处理换行符,以读取用户的完整输入。
2024-10-24 23:12:58
1454
原创 Go语言中三个输入函数(scanf,scan,scanln)的区别
Scanf 更加灵活,可以指定格式,但要求输入格式必须匹配。Scan 和 Scanln 更适合简单的输入读取,Scanln 还会检查是否有多余的输入。在实际应用中,根据需要选择适当的函数来读取用户输入。Scanf:根据格式化字符串解析输入,换行符如果不影响解析会被忽略。Scan:将换行符视为空白字符,会继续读取更多数据,直到满足所有变量的赋值要求。Scanln:以换行符作为输入结束标志,如果在所有参数读取完毕后还有多余输入(除了换行符),会返回错误。
2024-10-24 23:00:31
1388
原创 go语言中CreatedAt时间格式的处理
在 GORM 中,gorm.Model 中的 CreatedAt 字段是 time.Time 类型。为了将它转换成年月日时分秒的格式,可以使用 Go 的时间格式化函数 Format,它可以将 time.Time 类型的时间格式化为指定的字符串形式。Go 使用特定的参考时间来指定格式:2006-01-02 15:04:05。你可以根据需要的时间格式调整该模板。
2024-10-20 19:22:54
1185
1
原创 计算机网络物理层知识点总结
2. IEEE 802.11:无线局域网标准,定义了无线网络设备的工作方式,包括IEEE 802.11b(11Mbps)、IEEE 802.11g(54Mbps)、IEEE 802.11n(300Mbps)、IEEE 802.11ac(1Gbps)等。光纤(Optical Fiber):光纤通过光波在玻璃纤维中传递信号,具备极高的传输速率和极低的信号衰减,常用于长距离、高速率的通信。2. 信号编码:为了适应物理媒介的特性,物理层负责根据不同的传输媒介,将数据进行适当的编码。
2024-08-04 21:58:37
669
1
原创 计算机网络概述
计算机网络的精确定义并未统一计算机网络的最简单的定义是: 一些互相连接的、 自治的计算机的集合。互连是指计算机之间可以通过有线或无线的方式进行数据通信;自治是指独立的计算机,它有自己的硬件和软件,可以单独运行使用;集合是指至少需要两台计算机;计算机网络的较好的定义是:计算机网络主要是由一些通用的、可编程的硬件互连而成的,而这些硬件并非专门用来实现某-特定目的(例如,传送数据或视频信号)。这些可编程的硬件能够用来传送多种不同类型的数据,并能支持广泛的和日益增长的应用。
2024-07-21 20:59:35
1256
原创 Go语言协程通道使用问题
总之,虽然 select 和 time.After 的模式简单直接,但在需要真正取消操作或在多个 goroutine 间协调的场景中,使用 context 包是更好的选择。在使用 context 的版本中,如果超时发生,操作会被主动取消,避免了资源浪费。Context 包的引入大大简化了在 Go 程序中处理取消、超时和跨调用边界传值的复杂性,是构建健壮的并发和分布式系统的重要工具。是实现优雅取消和超时处理的关键机制,它允许 Go 程序以非阻塞的方式响应取消信号,从而编写出更加健壮和响应式的并发代码。
2024-07-11 15:44:45
1677
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅