自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 go slice切片的详细知识(包含底层扩容)

本篇文章是之前我在学习切片时遇到的一些问题,也在网上搜索了许多材料+实践。下面的代码不敢说一定正确,但一定是亲自实践过的。

2024-05-26 10:00:00 2623

原创 OAuth 2.0 接入第三方登录(有数据流向图)

角色英文名职责描述实际例子资源拥有者拥有受保护资源(如数据、功能)的用户或实体,决定是否授权第三方访问。用户(如你的 Google 账号)客户端Client第三方应用程序,请求访问资源拥有者的受保护资源。一个博客网站(请求访问你的 GitHub 仓库)授权服务器验证资源拥有者身份,颁发访问令牌(Access Token)给客户端。Google 授权服务器、GitHub OAuth 服务资源服务器存储受保护资源的服务器,根据访问令牌决定是否响应客户端的请求。

2025-05-27 12:19:45 626

原创 HTTP协议版本的发展(HTTP/0.9、1.0、1.1、2、3)

HTTP/0.9、1.0、1.1、2、3的详细区别

2025-05-25 16:35:33 1130 1

原创 JWT 全面指南:组成、生成、对比与双令牌实践

JWT 通常用于身份验证和信息交换。它的主要特点是信息通过数字签名进行验证,确保数据的真实性和完整性。JWT一个重要的特性是不可篡改性。JWT 一旦签发,在到期之前无法强制使其失效。组成JWT 是由三部分组成的,并且用点 (.) 分隔:Header(头部):描述JWT的元信息,主要包括使用的签名算法和token的类型。Payload(载荷):存储实际传递的数据。如用户的邮箱信息,不能存储敏感信息。Signature(签名):用于验证 JWT 的真实性,防止数据篡改。

2025-05-14 10:43:07 761

原创 加密算法总结

PS:本文对上面的学习资料进行补充,请务必要学习上面的资料。关于密码加密相关的关键词有:哈希加密(包含加密哈希算法、非加密哈希算法,慢哈希加密是哈希加密的一种特殊设计)、对称加密,非对称加密、加盐、成本因子、碰撞、撞库、彩虹表。

2025-05-03 10:25:09 673

原创 图论之并查集——含例题

并查集是一种用于处理不相交集合的合并与查询问题的数据结构。它主要涉及以下基本概念和操作:集合:并查集中的集合是由一组元素组成的,这些元素具有相同的属性或特征,集合之间相互不相交。代表元素:每个集合都有一个代表元素,用于标识该集合。集合中的其他元素都可以通过一定的关系与代表元素相连。初始化:将每个元素都初始化为一个独立的集合,每个集合的代表元素就是该元素本身。合并:将两个不同集合合并为一个集合。通常是将一个集合的代表元素连接到另一个集合的代表元素上,使得两个集合成为一个更大的集合。

2025-04-13 22:11:23 1090

原创 Reids 的io并发模型

异步 I/O 模型(Asynchronous I/O,AIO):在异步 I/O 模型中,应用程序发起 I/O 操作后,不需要主动去查询操作的状态,而是由操作系统在 I/O 操作完成后通过回调函数或信号等方式通知应用程序。例如,在读取文件或网络数据时,线程会被挂起,直到数据准备好或操作完成,期间线程不能执行其他任务,这会导致线程资源的浪费,在处理多个 I/O 操作时效率较低。由于主线程是单线程的,命令的执行是串行的,这保证了 Redis 的数据一致性和事务、Lua 脚本等功能的正确性。

2025-04-05 08:06:21 798

原创 Unix/Linux 系统下的文件权限

drwxr-xr-x 是一个常见的 Unix/Linux 文件系统中的权限表示法,用于描述文件或目录的访问权限。每组三个字符可以转换为一个八进制数字,rwx 表示 7,r-x 表示 5,所以 drwxr-xr-x 可以转换为 0755。这个命令将设置 mydir 目录的权限,使得所有者具有读、写、执行权限,而组和其他用户具有读和执行权限。接下来的九个字符:权限位,分为三组,每组三个字符,分别表示文件所有者、文件所属组、其他用户的权限。第一个字符 (d):表示这是一个目录。第一个字符:文件类型。

2025-03-28 11:47:11 1508

原创 路由限流(Gin框架)

也就是说令牌桶是允许一定程度的并发的,比如同一个时刻,有100个用户请求,只要令牌桶中有100个令牌,那么这100个请求全都会放过去。令牌桶算法的原理是系统以恒定的速率产生令牌,然后把令牌放到令牌桶中,令牌桶有一个容量,当令牌桶满了的时候,再向其中放令牌,那么多余的令牌会被丢弃;当想要处理一个请求的时候,需要从令牌桶中取出一个令牌,如果此时令牌桶中没有令牌,那么则拒绝该请求。令牌桶是匀速向桶中添加令牌,服务请求时需要从桶中获取令牌,令牌的数目可以按照需要消耗的资源进行相应的调整。

2025-03-04 09:00:00 1036

原创 Mac/Linux 下的趣味命令大盘点:从蒸汽火车到彩虹数字雨

如果你也想试试这些“无用但有趣”的命令,赶紧安装 Homebrew(Mac 必备工具),在终端中玩一玩!如果在服务器上遇到这些“惊喜”,别紧张,可能只是你的学长在恶作剧,哈哈哈。让我们来看一看如何下载蒸汽火车吧。当你运行这个命令时,终端会显示一列蒸汽火车从左到右驶过的 ASCII 动画,特别有趣且复古。模拟《黑客帝国》中的“数字雨”效果,让终端显示绿色(或自定义颜色)的流动数字,营造出高科技、黑客氛围,非常酷炫!是一个经典的命令,会生成一个 ASCII 艺术形式的奶牛,并“说”出你输入的文本,萌趣又有趣。

2025-03-01 17:12:35 1034

原创 熔断降级(Go语言实现)

虽然这会导致暂时停电,但避免了更大的损失。一个简单的商品详情查询服务,优先从 Redis 缓存读取,如果缓存不可用,则查询数据库,但通过熔断降级防止数据库过载。降级处理:停电后,你可能只能用应急灯或手电筒,而不是所有电器,这是一种“降级”措施,等到电路恢复正常再逐步恢复使用。完全熔断状态:如果故障持续,熔断器“完全切断”,所有请求不再访问 Redis,而是直接触发降级逻辑,保护后端服务。恢复过程:几分钟后,Redis 恢复,熔断器进入半开状态,测试成功后关闭熔断,系统重新使用缓存,恢复正常功能。

2025-02-28 13:00:00 725 5

原创 Redis缓存读写策略、一致性、雪崩、击穿、穿透

假设「请求 A 」和「请求 B 」两个请求,同时更新「同一条」数据,则可能出现这样的顺序:A 请求先将缓存的数据更新为 1,然后在更新数据库前,B 请求来了, 将缓存的数据更新为 2,紧接着把数据库更新为 2,然后 A 请求将数据库的数据更新为 1。举个例子,比如「请求 A 」和「请求 B 」两个请求,同时更新「同一条」数据,则可能出现这样的顺序:A 请求先将数据库的数据更新为 1,然后在更新缓存前,请求 B 将数据库的数据更新为 2,紧接着也把缓存更新为 2,然后 A 请求更新缓存为 1。

2025-02-27 15:22:57 898

原创 Go map 底层分析

所谓等量扩容,实际上并不是扩大容量,buckets数量不变,重新做一遍类似增量扩容的搬迁动作,把松散的键值对重新排列一次,以使bucket的使用率更高,进而保证更快的存取。每个哈希表的实现对负载因子容忍程度不同,比如Redis实现中负载因子大于1时就会触发rehash,而Go则在在负载因子达到6.5时才会触发rehash,因为Redis的每个bucket只能存1个键值对,而Go的bucket可能存8个键值对,所以Go可以容忍更高的负载因子。,达不到第1点的临界值,就不能触发扩容来缓解这种情况。

2025-02-15 10:00:00 637

原创 超详细配置本地的DeepSeek模型

就像美国推出安卓系统,中国不断完善,但安卓系统还是美国的,deepseek反过来让所有国家共同完善,但还是中国的。不同模型名称中的 1.5B、7B、14B 等数字代表模型的参数量,这里的 B 是“Billion”(十亿) 的缩写。参数量的多少直接影响模型的“聪明程度”、计算资源需求和适用场景,也不是说越多越好,因为越多其硬件的资源消耗也会越多,要根据自己电脑的情况来定。第一次运行该命令会下载 1.5b 的版本,下载完成以后,再执行该命令就无需下载,可以直接运行了。再一次选择:Ollama API。

2025-02-09 11:14:52 1142

原创 用Go实现 SSE 实时推送消息(消息通知)——思悟项目技术4

SSE(Server - Sent Events)是一种允许服务器向客户端实时推送更新的 Web 技术。是一种基于 HTTP 协议的单向通信机制,服务器可以在客户端建立连接后,持续不断地向客户端发送事件流。客户端只需发起一次请求,服务器就能随时向客户端推送新的数据,无需客户端反复请求。

2025-02-08 09:00:00 953

原创 TCP 三次握手四次挥手

TCP三次握手(Three-Way Handshake) 是建立TCP连接时,客户端和服务器之间为了保证可靠的数据传输而进行的三次消息交换。三次握手的目的是通过交换序列号,确认通信双方都准备好建立连接,并且双方都能进行数据的发送和接收。注意:三次握手只在TCP连接建立时进行一次,而不是在每次发送消息时都进行。因为TCP是一个 面向连接的协议,这意味着在发送数据之前,客户端和服务器需要建立一个持久的连接。这个连接在数据传输过程中保持开放,直到完成数据交换或者关闭连接。

2025-01-25 10:30:49 1351

原创 go chan底层分析

和分别是接收(

2025-01-16 21:32:36 1314

原创 chrome浏览器中 F12 查看接口请求与响应

打开页面,点击F12。

2025-01-14 09:00:00 2401

原创 go 协程练习例题

创建一个程序,计算一个大数组的和,使用多个 goroutine 分担计算任务。将数组分成若干部分,每个部分由一个 goroutine 计算其部分的和,然后将部分和合并得到最终结果。思路:两个协程并发,一个协程读完然后往通道里写数据,另一个协程写完然后读数据,两个协程交替进行,交替阻塞。使用并发/并行的方式,将统计素数的任务分配给多个(4 个)goroutine 去完成。3、要保证任务按照添加的顺序依次执行,即每个任务在前一个任务完成后才能开始执行。2、函数 Start():启动任务调度器并开始执行任务。

2024-12-15 15:05:25 463

原创 go 使用unsafe包实现string和[]byte的转换

特性通过无类型指针转换内存分配分配新的内存无额外分配,共享底层数据数据安全数据独立,修改互不影响修改返回的 []byte 会影响原字符串性能较低:需要分配内存和复制数据较高:直接操作底层指针易读性和维护简单易读较复杂适用场景通常是首选方法,安全易用用于对性能要求极高且可控的场景。

2024-12-08 10:00:00 767

原创 Go 语言文件操作

如果你尝试执行写入操作(如 file.WriteString),会返回一个错误,因为文件没有写入权限。指定新创建文件的权限模式(如果该文件已经存在那么这个文件权限不会起作用,只有在创建文件的时候才起作用)。使用 ioutil.ReadFile 一次将整个文件读入到内存中,适用于文件比较小的情况。os.O_RDWR 表示以读写模式打开文件,这样你就可以在文件上执行读和写操作;表示要打开或创建的文件的路径和名称。注意:用这个方法打开文件,只能读内容,不能写入内容。指定文件打开的模式或操作类型。

2024-12-05 10:00:00 1555

原创 TCP 粘包问题

粘包指的是在基于流的协议(如 TCP)中,由于数据的传输特性导致接收方无法明确区分多条消息的边界,从而将多条消息粘合在一起接收,或者将一条消息拆分成多次接收。

2024-12-05 09:00:00 451

原创 go语言静态资源打包——思悟项目技术3

Go 语言默认情况下打包并不会将静态文件直接包含在可执行文件中。Go 编译器只会打包 .go 源代码文件,静态文件(如 HTML、CSS、JS 或图片等)并不会自动包含在生成的二进制文件中。

2024-10-29 09:32:23 772 1

原创 go语言gin框架平滑关闭——思悟项目技术2

平滑关闭(graceful shutdown)是指在停止服务时,能够让现有的连接、任务或者操作优雅地完成,而不是直接中断。平滑关闭的核心思想是在系统接收到停止信号后,不再接收新请求,只处理当前正在执行的请求,确保所有请求完成后,系统才正式关闭。

2024-10-29 09:27:58 647

原创 golang qq邮件发送验证码——思悟项目技术1

这个例子中我使用的是 gopkg.in/gomail.v2 包,发送邮件也可以用 github.com/jordan-wright/email 包。通过编码的方式发送邮件,就是调用qq邮箱提供的接口来进行邮件的发送,我们在编写该功能前,需要拿到qq邮箱的POP3/SMTP服务的授权码。我们开启SMTP/IMAP服务,生成授权码,保存一下授权码,后面要用到。因为涉及到数据库,所以我省略掉了这部分的代码,读者自行添加。

2024-09-26 10:30:00 1088

原创 计算机网络——2

计算机网络整个体系有两个大的分类:一个是国际组织制定的OSI七层模型,一种是实际使用中的TCP/IP四层模型。

2024-08-05 09:04:53 823 1

原创 计算机网络——1

下面详细介绍局域网的覆盖范围和拓扑结构,以太网和局域网交换机,以及广域网(Wide Area Network,WAN),包括其覆盖范围和传输介质,以及路由器和调制解调器。它将数据分割成小的数据段,并通过三次握手建立连接,确保数据在源和目标之间的可靠传输。由于没有额外的开销,UDP具有低延迟和高效率的特点,适用于对实时性要求较高且对数据传输的可靠性要求不高的应用。IP协议是无连接的,它不提供可靠性传输和流量控制,主要关注数据包的正确传递。TCP提供面向连接的可靠传输,而UDP提供无连接的不可靠传输。

2024-07-21 20:40:26 769

原创 Go 协程通道使用注意

当一个 channel 已经关闭而且其中的元素已经全部被取出时,再从管道中取出数据会返回该元素类型的零值,并且 ok 会被设置为 false。因为在已关闭的 channel 上进行接收操作会立即返回零值,但如果不进行检查,可能会误认为是从 channel 中接收到了有效的数据。因此,通过检查 ok,我们可以确定是否成功接收到了有效的值。close(chan):关闭通道并不会丢失里面的数据,只是让读取通道数据的时候不会读完之后一直阻塞等待新数据写入。这五个管道的关闭时间都是在:所在函数运行完毕的时候关闭的。

2024-07-16 17:17:14 785

原创 go mod 依赖管理补充2

go.sum文件记录了每个依赖包的哈希值,在构建时,如果本地的依赖包 hash 值与go.sum文件中记录得不一致,则会拒绝构建。go.mod文件是Go模块系统中的核心文件,用于定义和管理一个 Go 项目的依赖关系和模块信息(如依赖包的路径和版本号)。总结:go.sum 文件引入依赖包的路径和版本号,而go.sum校验引入的依赖包。go.sum 文件的目的是为了确保依赖包的一致性,防止依赖包错误、被黑客篡改等。

2024-07-08 17:25:30 238

原创 go slice切片的详细知识(包含底层扩容)——2

Go 语言的切片扩容机制是相当复杂的,它考虑了多种因素来确定新的容量,以便在性能和内存使用之间找到平衡。Go 语言的 runtime 库在执行切片扩容时,有时会为了减少频繁的内存分配而使用稍大的倍数。最后两行代码:对 newcap 作了一个内存对齐,这个和内存分配策略相关,所以最终结果不一定是 1.25的整数倍(有时候扩容和元素类型的字节数有关系)。最终的结果可能会比严格的1.25倍略大一些,具体取决于当前的容量和内存分配的优化策略。切片在被截取时的另一个特点是,被截取后的数组仍然指向原始切片的底层数据。

2024-06-02 19:36:32 1207 2

原创 go map与哈希表的那些事——map底层数据结构(详细+图解)

扩容操作会使得桶的数量翻倍,并重新计算每个元素的哈希值,将其分配到新的桶中。在发生哈希冲突时,Python中dict采用的开放寻址法,Java的HashMap采用的是链地址法,而Go map也采用链地址法解决冲突,具体就是插入key到map中时,当key定位的桶填满8个元素后,将会创建一个溢出桶,并且将溢出桶插入当前桶所在链表尾部。等量扩容,实际上并不是扩大容量,buckets数量不变,重新做一遍类似增量扩容的搬迁动作,把松散的键值对重新排列一次,以使bucket的使用率更高,进而保证更快的存取。

2024-05-30 10:00:00 1267

原创 Go map的增删改查

golang map的增删改查

2024-05-10 10:00:00 287 1

原创 Mac goland上传项目到gitee

准备工作:创建一个gitee仓库。

2024-04-15 11:06:30 570 1

原创 Go语言中的new和make的区别

Go语言中new和make都是用来内存分配的原语(allocation primitives)。简单的说,new只分配内存,不初始化内存;make用于slice,map,和channel的初始化make和new都是golang用来分配内存的內建函数,且在堆上分配内存,make 即分配内存,也初始化内存。new只是将内存清零,并没有初始化内存。make返回的还是引用类型本身;而new返回的是指向类型的指针。make只能用来分配及初始化类型为slice,map,channel的数据;

2024-04-05 14:00:00 662 1

原创 go mod 依赖管理

vendor其实就是将原来放在GOPATH/src的依赖包放到工程的vendor目录中进行管理,不同工程独立地管理自己的依赖包,相互之间互不影响,原来是包共享的模式,通过vendor这种机制进行隔离,在项目编译的时候会先去vendor目录查找依赖,如果没有找到才会再去GOPATH目录下查找;使用 go mod download 路径,只会下载当前的包,但是如果这个包也要依赖其他的依赖,那么第二个依赖就没有下载,我们可以通过go mod tidy,所有间接要依赖的东西都会被下载。go.sum 文件。

2024-04-01 10:00:00 1553

原创 golang 连接 mysql

【代码】golang 连接 mysql。

2024-02-04 09:00:00 470 1

原创 golang channel有无缓冲区的区别

取的速度较慢,放了5个才开始取,由于缓冲区已经满了,所以取出一个之后,才能再次放入;放完了之后虽然缓冲区关闭了,但是缓冲区的内容还保留,所以还能继续取出。有缓冲是异步的,例如 make(chan int, 1),就是一个送信人去你家仍到你家的信箱,转身就走,除非你的信箱满了,他必须等信箱空下来,有缓冲的保证信能进你家的邮箱。无缓冲是同步的,例如 make(chan int),就是一个送信人去你家门口送信,你不在家他不走,你一定要接下信,他才会走,无缓冲保证信能到你手上。

2024-01-28 10:23:33 369

原创 Go中打开文件却显示“no such file or directory”

2.在终端运行(A_practice 是我的文件夹名,你需要换成你的文件夹名)我们用一个例子演示:我想读取 Aardvarks.txt 里面的内容。go项目中的文件路径太长了,系统无法识别。1.在终端进入到 A_practice 文件夹中。这时我们就可以成功运行 a.go 了。

2023-12-21 15:46:26 1555

原创 Go 使用append的一些坑

【代码】使用append的一些坑。

2023-12-19 10:12:41 575 1

原创 javaFX + mysql 学生管理系统---超详细

代码和教师管理学生基本一致,只是教师管理的是教师自己的学生,管理员管理的是全部学生,后面有完整全部代码。提示窗口使用的十分频繁,所以我把它封装了一下放到utils中,以后使用可以直接调用函数。我将学生密码进行加密存放到数据库中,该加密是不可逆加密,无法逆推。这个柱状图是实时变化的,更改了数据库中的数据,柱状图也会变化。输入ID后会自动显示原先的数据,教师无法更改学生的密码。查询学生之后,我们点击刷新可恢复表格中的学生数据。教师增加学生和学生自己注册基本一致。教师只能增删改查属于自己的学生。

2023-10-25 11:17:07 286 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除