自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis 主从复制实现原理深度详解

Redis 主从复制(Replication)是构建高可用 Redis 系统的基石,其核心作用是实现数据冗余备份、读写分离以及为哨兵(Sentinel)和集群(Cluster)提供高可用基础。本文将从核心概念、完整流程、关键机制、演进优化等维度,深入、严谨地剖析其实现原理。

2026-03-15 17:13:55 566

原创 Go-Zero详细教程之快速开始第一节(图书增删改查示例)

本文介绍了使用Go-Zero框架快速构建图书增删改查API的步骤。首先通过goctl api new命令生成项目模板,然后修改api文件定义请求/响应结构体和服务接口。文章详细解析了项目中的关键文件:api文件定义接口规范,config.go作为配置中枢,svc/servicecontext.go作为依赖注入容器,types.go定义数据契约。接着在logic层补充业务逻辑,最后启动项目并测试接口。文章重点讲解了Go-Zero的核心设计理念,如配置即代码、依赖注入和分层架构,展示了如何快速构建一个结构清晰、

2025-11-25 23:48:24 973

原创 跨域中间件通俗理解

为什么需要Cors函数?因为你家小区的保安大叔(浏览器)太负责了,默认不让任何外人进。你必须写一张授权通知单(Cors中间件)贴在门卫室,清楚地告诉保安大叔,什么样的外来人员(哪个前端地址)、用什么样的方式(POSTGET)、携带什么样的东西(请求头),是可以放行的。没有这张通知单,所有来自外部的请求都会被保安大叔拒之门外。有了它,跨小区的合作才能顺利进行。

2025-07-13 23:32:57 1002

原创 ConSul怎么实现节点故障恢复--搭配通俗易懂的例子

备份,备份,备份:定期对 Consul 数据进行快照备份 () 是最保险的灾难恢复策略。在丢失 Quorum 的最坏情况下,你可以用快照快速恢复到一个全新的集群。高可用部署:在生产环境中,务必将 3 或 5 个 Server 节点部署在不同的物理机或云服务的可用区 (Availability Zone),以防止单点物理故障。理解角色差异:Client 节点的故障是小问题,Server 节点的故障才是大问题。Server 的高可用性是整个 Consul 集群稳定的基石。

2025-07-12 14:59:55 1123

原创 博客系统搭建学习

解析命令行参数,flag 包是Go语言内置的命令行参数解析库,它提供了简单而强大的命令行参数处理能力。这行代码注册了一个字符串类型的命令行参数。详细解释一下每个参数的含义:&options.File 是参数值的存储地址,解析后的值会直接存储到 options.File 字段中“f” 是参数的短名称,用户可以通过 -f 来指定这个参数“settings.yaml” 是默认值,如果用户没有指定 -f 参数,就会使用这个默认值。

2025-07-09 08:22:13 901

原创 Go面试题:数组和切片有什么异同?

1.数组和切片都是存储相同类型元素的数据结构。4. 都可以使用for range来遍历。2. 都可以使用len函数来获取长度。3.都可以使用索引来访问。

2025-07-07 15:04:54 237

原创 GoFrame电商项目面试

在 gtoken 里,登录状态是靠“两级缓存”来保存的:第一层用 Token 去映射 userKey,第二层再用 userKey 去映射完整的用户数据。也就是说,缓存里同时存在两条记录——token:<随机串>存的只是User:456这种 userKey,而才存序列化后的 userInfo。这样设计的好处是显而易见的:当拿到请求里的 Token 时,先查第一层就能迅速确定“这是谁”;

2025-07-06 16:19:17 706

原创 GoFrame电商项目登录鉴权AI学习记录

随时待命!无论是架构设计、业务流程、源码细节还是部署运维,只要你提出问题,我都会给出尽可能完整、深入而又易于理解的讲解与示例。请开始提问吧。 这行代码的作用可以分成两部分理解:更直观地看流程:因此这一行代码完成了:• 生成一个 后台专用的 Token 中间件 ()• 若初始化失败,把错误保存到 供后面判断• 当初始化成功后,你就可以在 路由组里这样使用它:挂载完成后, 提交账号密码时由 GToken 处理并签发 Token;而子路由中的业务接口在收到请求时,都会先经过 GToken 的鉴权逻

2025-07-06 10:34:03 872

原创 BlogX项目Go-gin--根据IP获取地理位置

• ip.IsLoopback() 内置判断 IP 是否属于 127.0.0.0/8(IPv4 回环)或 ::1(IPv6)。• ip.To4() 若 IP 是 IPv4,返回 4 字节切片;• 入参:ip string(字符串形式的 IP,如 “192.168.1.5”)。• 好处:对外提供 字符串版本 API,内部使用更强大的 net.IP API。• 入参:ip net.IP(字节切片),已经是结构化类型;输入 IP 字符串,内部转成 net.IP,再复用核心逻辑。更底层,直接接受 net.IP。

2025-06-25 11:13:10 537

原创 GoFrame电商项目上传文件至七牛云详解

这段代码就是准备好一条“文件档案”记录:记录文件名、硬盘存储位置、对外访问地址以及上传者 ID,为后续插入数据库做准备。一句话先说明场景上一步把文件的“身份证”(data变量 ) 准备好了;这行代码的任务就是把这张身份证送进数据库存档,并拿回系统自动生成的编号(id)。原代码id, err := dao.FileInfo. // ① 找到“文件信息”这张表的 DAOCtx(ctx). // ② 带上本次 HTTP 请求的 contextData(data). // ③ 写入准备好的记录 data。

2025-06-21 14:15:06 1196

原创 GoFrame的Gtoken--基于电商项目以及GPT-o3的辅助解惑

的作用就是临时创建一份最简单的 Context 作为占位符,让后面的数据库查询等函数满足签名要求;如果未来需要加超时或取消逻辑,再把TODO()换成更合适的WithCancel等派生 Context。这段代码做了“空账号/空密码的兜底校验”:如有任一为空→立刻返回统一格式的登录失败 JSON → 终止后续处理,既保证安全也节约服务器资源。这行代码声明并初始化了一个空的管理员实体adminInfo,为后面把数据库查询结果扫描进来做准备。本身没有。

2025-06-20 15:16:53 814

原创 Go语言context简单理解

Go语言中的context就像一个"随身文件夹",用于在业务请求中传递控制信号和元数据。它通过树状结构实现统一取消、超时控制和跨层数据共享,解决了全局变量和channel的局限。核心功能包括:1)通过Done()和Deadline()实现超时/取消;2)通过Value()传递少量元数据。典型应用场景包括HTTP请求、数据库查询和多协程协作,确保资源及时释放和统一行为。context的设计使Go程序在并发场景下更加高效可控。

2025-06-19 09:22:51 609

原创 GoFrame的api层和model层的数据结构有什么区别,各有什么作用以及为什么这么设计?

像摄影师拿到的「拍摄指令」——只写业务必须的信息,不带路由、校验、Json 标签这些“前台”元素。在代码里,我们也把“前台”与“后台”职责拆开,避免一份数据结构同时承担太多角色,导致未来难维护。就像柜台最后给顾客的小票或回执,上面只写他们关心的东西(这里就是生成的。它们长得像,但各司其职,这就是这套目录与结构体设计的核心理念。的结构体 = “让前端/外部世界能顺畅沟通”的结构体 = “让后台业务能稳定地做事”是摄影师拍完照后给柜台的“成片编号”。就像「顾客填写的预约单」。⑤ 控制器把它包装成。

2025-06-17 20:21:40 473

原创 BlogX项目数据库读写分离AI面试题

下面是一组围绕“项目中的数据库读写分离”设计的面试题,先给出提问,再给出面试官心中的理想回答示例。题目难度从基础到进阶递进,既考察对现有代码的理解,也延伸到常见的线上实战问题。(读池),而写库故障不会影响已经存在的从库连接池。,让 GORM 打印所有 SQL,帮助定位跨库路由是否正确(比如读操作是否真的落到从库)。面试者能回答到 80% 以上,就说明既熟悉项目代码,也理解读写分离的底层机制与生产实践。操作(First、Find、Scan、Raw 查询)。Q5 :如果线上写库宕机,读操作还能继续吗?

2025-06-11 16:47:34 489

原创 GO语言使用gorm的dbresolver插件实现数据库读写分离

core/init_db.go: 利用 GORM 的 dbresolver 插件,把两份配置注册成 “Sources / Replicas”GORM 会把所有会写入数据的操作(Create、Update、Delete、Exec、事务)发送到这里。如此,“读写分离”在项目中就靠这短短十几行实现,既灵活(配置即开关),又安全(配置缺失时自动回退单库)。所有纯查询(First、Find、Scan、Raw SQL 查询)会走这里。settings.yaml文件中读库跟写库的配置信息:db:读库,db1:写库。

2025-06-11 16:17:29 986

原创 Blogx项目配置文件读取流程详解

1.终端输入go run main.go ,程序启动,调用,flag 包会去解析用户在命令行输入的内容,默认读取settings.yaml文件2.进入函数,读取配置文件到bytedata,此时bytedata里存储的是原始的text文本信息3.反序列化,把YAML → Go 结构体,然后 return 把填好的指针 *conf.Config 交出去,赋值为global.Config。

2025-06-10 23:44:54 615

原创 GO自带日志库log包解释

Go标准库log包使用详解:通过示例代码演示了log包的基本配置和用法。1)初始化配置:设置日志格式(日期/时间/文件名)、前缀和输出文件;2)使用log.Println写入日志。关键点:SetFlags控制格式,SetPrefix添加前缀,SetOutput指定日志文件。标准log包适合轻量级需求,更复杂场景需用第三方库。该实现简洁高效,20行代码完成日志系统基础搭建。

2025-06-10 23:34:06 1266

原创 GO 语言中的flag包--易懂解释

包就是 Go 官方自带的“命令行参数解析器”。你先用它列出所有可以接受的参数(带默认值和帮助说明),然后在程序启动时让它把用户真正输入的内容填回对应变量,自此你的业务逻辑就能像平常读取普通变量一样使用这些配置了。解析完毕后,剩下的非选项参数(比如文件名、路径)也会被单独保存,供你查看。这些声明就像菜单,把可用的选项、默认值和说明文字都写清楚了。需要一个字符串,默认值是 settings.yaml”;• 如果用户什么都没填,则保持默认值。布尔开关,默认值 false”;改成 “prod.yaml”;

2025-06-10 20:46:13 441

原创 JVM面试题--说一说Java的执行流程

你首先在电脑上用文本编辑器(比如Notepad、IDEA)写一个Java程序,保存为.java文件。这个文件就是Java的“源代码”,它就像是一份用人类语言写的“说明书”。接下来,你需要用javac工具(Java编译器)把.java文件翻译成另一种格式——.class文件)。?javac.class这会启动,它是运行Java程序的核心。?JVM会用一个叫(ClassLoader)的工具,把.class文件加载到内存中。JVM会分配内存(比如堆、栈),并准备好执行程序的环境。JVM加载完字节码后,会通过。

2025-05-31 12:16:14 648

原创 Java基础面试题--jdk和jre的区别

摘要: JDK(Java开发工具包)提供编译、调试等开发工具,适合开发者编写和运行Java程序;JRE(Java运行时环境)仅支持运行已编译的Java程序,适合终端用户。JDK包含JRE和开发工具(如javac),而JRE仅含JVM和基础类库。现代Java版本(9+)中JDK已整合JRE,开发者直接安装JDK即可。核心区别在于功能覆盖:JDK用于开发,JRE用于执行。

2025-05-29 18:03:12 801

原创 Gin--Blog项目-flags文件解析

这个文件 的主要作用是处理程序的命令行参数(也称为标志或flags)。它允许用户在启动程序时通过命令行传递不同的选项,从而控制程序的行为。具体来说,这个文件做了以下几件事情:定义程序可接受的命令行选项:解析命令行参数:根据参数执行特定操作:下面我们来逐行解释代码:这行代码声明了当前文件属于 包。包是 Go 语言中组织代码的一种方式。这里导入了两个标准库:这定义了一个名为 的结构体(struct)。结构体是一种自定义的数据类型,可以包含多个不同类型的字段(成员变量)。这行代码声明了一个名为 的

2025-05-20 10:19:35 1089

原创 MySQL中的Change Buffer是什么,它有什么作用?

然而,随着存储技术的发展(尤其是SSD的广泛应用),其必要性和默认配置也在发生变化,需要根据具体的硬件环境和工作负载进行评估和调整。

2025-05-19 21:18:09 1000

原创 Git基础面试题

git rm和系统的rm(在 Windows 上是delrmdelgit statusrmrm <文件名>git addgit rmgit addgit rm。

2025-05-19 20:33:52 1162

原创 BlogX项目Ai面试系列-配置管理和数据库的读写分离

在项目中,应用程序的配置通过外部化的 YAML 文件管理,主要优点包括配置与代码分离、可读性高、支持复杂数据结构等,但需注意敏感信息的安全处理。GORM 的 dbresolver 插件用于实现数据库读写分离,Sources 配置写库,Replicas 配置读库。GORM 根据操作类型自动路由请求,若读库不可用,读请求会回退到写库。若主库故障,写操作将失败,但读操作仍可通过从库执行,确保部分功能可用。

2025-05-17 09:30:12 795

原创 从配置文件开始到实现数据库读写分离的整个详细的工作流程

本文描述了从读取配置文件到完成数据库读写分离配置的整个工作流程。首先,在 conf/enter.go 中定义了配置结构 Config,包含系统、日志和数据库配置。接着,在 global/enter.go 中创建了全局变量 Config 和 DB,用于存储配置信息和数据库实例。然后,通过 core/init_conf.go 读取并解析 settings.yaml 配置文件,将其内容填充到 Config 结构体中,并将结果存入全局变量。最后,在 core/init_db.go 中,使用加载的数据库配置初始化 G

2025-05-17 09:27:16 729 1

原创 Gin_BlogX 配置文件解析

settings.yaml 是 Gin_BlogX 项目的配置文件,采用 YAML 格式,用于存储应用程序的运行时设置,如系统配置、日志记录和数据库连接信息。该文件的主要作用包括外部化配置、环境感知、集中管理和提高可读性。通过将配置信息从代码中分离,开发者可以在不重新编译应用程序的情况下修改配置。文件中的 system 部分定义了应用程序的 IP、端口和运行环境;log 部分配置了日志记录;db 和 db1 部分分别定义了主数据库和备用数据库的连接信息,支持读写分离。 在 core/init_db.go 文

2025-05-17 08:53:45 969

原创 Go电商项目--Ai模拟面试:验证码模块

它定义了一套规范或契约,规定了一个“验证码驱动”应该具备哪些行为(方法),比如绘制验证码、生成问题和答案等。对现有设计优点的理解(接口带来的扩展性),实际需求变更时的分析和设计能力,代码组织和模块化思考。总结来说,生产环境的错误处理应该关注日志的完整性、结构化、可追溯性,以及对用户和运维的友好性。对状态管理、存储机制的理解,分布式系统设计中常见问题的认知,以及解决问题的能力。对错误处理重要性的认识,生产环境日志和监控的最佳实践,以及代码健壮性的思考。你好,我看了你项目中的这个验证码模块。

2025-05-15 11:25:33 908

原创 Go商城项目---验证码模块的整个工作流程

这个流程清晰地展示了从验证码的生成、显示到最终验证的完整闭环。

2025-05-15 11:03:19 1033

原创 Go商城项目---登录页面实现验证码验证(base64captcha)

首先创建一个store:作用: store 用于存储生成的验证码的ID和其对应的正确答案。DefaultMemStore 是 base64Captcha 库提供的一个默认的基于内存的存储方式。工作机制: 当一个验证码生成时,它的ID和答案会被存入这个 store。当用户提交答案进行验证时,系统会根据ID从 store 中检索出正确的答案进行比较。因为是内存存储,所以如果应用程序重启,这些存储的验证码信息会丢失。其次创建生成验证码的函数:作用: 这个函数用于创建一个新的图形验证码。返回值:i

2025-05-15 11:01:42 823

原创 Gin完结,明天开始学项目

1.路由中间件,全局中间件,中间件的执行顺序,分组路由注册中间件2.自定义model3.实现文件的上传4.gin中cookie和session的实现5.使用gorm实现对数据库的增删改查,以及gorm中事务的使用。

2025-05-13 22:33:30 176

原创 Gin学习之路

1.gin中HTML模板渲染2.gin中静态web服务3.自定义模板函数4.路由分组以及剥离。

2025-05-12 22:47:43 185

原创 算法日记Day02

这个end是我看灵神的题解才看懂的,真是太神了!target+1的起始位置的前一个位置就是target出现的最后一个位置,另外需要**start==len(nums)**来判断是否越界,比如 1 3 5 7查找9,start=4。

2025-05-09 13:32:57 193

原创 每日八股面试题:map的扩容机制

这种情况是因为频繁插入元素后又删除元素,导致溢出桶增多,但是键值对的总数一直不高,此时 key 的存储比较分散,查询的效率变低。即原有的键值对不会一次性搬迁到新的桶中,每次最多只会搬迁 2 个槽,这个迁移工作分摊到后续的 map 操作(插入、删除、查找)中,以减少扩容对性能的影响。增量扩容:当键值对的数量大于 8 且大于桶数组的 6.5 倍时,此时桶都快满了,需要触发增量扩容,桶数量翻倍。等量扩容:不会增加桶的数量,而是对现有的桶进行排列,将溢出桶中的键值对分散到各个桶中,从而减少溢出桶的数量。

2025-05-09 09:16:05 312

原创 每日八股面试题:Go语言中map的底层实现原理

map的底层是通过hash表来实现的,使用桶数组(buckets)来存储键值对,map在存储时使用hash函数将键映射到相应的桶中,每个桶会存储8个键值对,超出以后会用溢出桶来解决hash冲突。

2025-05-09 08:59:52 335

原创 Goframe项目Ai面试学习Day01

在。

2025-05-08 00:18:49 1014

原创 萝卜头算法日记day01

时间复杂度为O(N^2),空间复杂度为O(1)

2025-05-07 22:28:05 200

原创 Go语言基础面试题:数组与切片的区别(面试看这个就够了!)

数组声明时需要指定长度,长度是其类型的一部分,而切片是对数组的抽象,声明时无需指定长度2.创建方式不同数组可以使用字面量和var关键字来创建,切片可以使用字面量,make函数或者从数组、切片中截取来创建切片3.长度固定性不同数组的长度固定,一旦声明,不可修改,而切片的长度是可变的,可以通过append()函数来动态添加元素4.内存分配不同数组是值类型,在传递给函数或者赋值的时候,会复制整个数组,进而会消耗更多内存,对数组的修改只会影响其副本。切片是引用类型,存储的是对底层数组的引用,传递切片时只

2025-05-07 16:07:25 382

原创 全网最通俗易懂的Cookie和Session讲解!看完不会你骂我!

Cookie 像钥匙,Session 像抽屉,两者配合让网站既能 “记住” 你,又能安全高效地处理你的数据。

2025-04-26 14:31:40 556

原创 Redis常见面试题:为什么Redis性能如此之高?

Redis常见面试题:为什么Redis性能如此之高?

2025-04-13 21:37:36 759

原创 Go语言map底层原理

通过计算得到的哈希值取其后B位,此图中为5位得到这个键值对存储在哪一个桶中,再通过前八位定位到tophash的第几个,进而得到key和value的值,如果第一个桶没找到,顺着overflow指针查找第二个桶,以此类推。哈希值用于确定这个键 - 值对应存放在哪个桶中。我们可以看到map实现在hmap这个数据结构中,hmap中有一个桶数组,桶数组中存放着tophash,key和value以及overflow指针,当插入一个键 - 值对时,Go 语言会先对。图片来源于掘金社区韩树作者。

2024-11-29 20:49:21 496

空空如也

空空如也

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

TA关注的人

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