- 博客(69)
- 收藏
- 关注
原创 构建一个抗揍的 Go TCP 聊天服务:异常兜底与防御性编程实践
本文分享了如何通过防御性编程将Go实现的TCP聊天服务改造为抗攻击的健壮系统。关键措施包括:1) 使用recover捕获goroutine panic防止服务崩溃;2) 采用单通道写入机制避免并发写入阻塞;3) 流式读取实现超长消息防护;4) 分离加锁与处理逻辑防止广播死锁;5) 利用sync.Once实现幂等资源释放。这些方法有效应对了网络抖动、恶意攻击和资源泄露等问题,使简单聊天服务具备生产环境所需的可靠性。
2026-04-05 21:59:09
263
原创 使用 sync.Once 解决 Go 并发场景下的重复下线广播问题
本文介绍了在Go语言并发场景下使用sync.Once解决重复下线广播问题的实践。文章首先描述了聊天室服务端中User对象的管理流程,包括上线、消息处理和下线广播等核心业务。随后分析了当用户输入exit指令时,由于连接关闭和错误处理逻辑并发触发,导致下线消息被重复广播的Bug。通过引入sync.Once机制,确保注销逻辑只执行一次,优雅地解决了重复消息问题和潜在资源释放风险。这种方法有效解耦了多个触发条件和唯一清理终态,提升了系统的健壮性。
2026-04-05 19:08:54
209
原创 让 gRPC 服务同时支持 HTTP/JSON 的gRPC-Gateway
gRPC-Gateway 摘要 gRPC-Gateway 是 Google 官方提供的反向代理工具,可将 gRPC 服务自动转换为 RESTful HTTP/JSON 接口。它通过解析 Protobuf 文件中的 google.api.http 注解,生成 HTTP 网关代码,实现 gRPC 和 HTTP 双协议支持。主要流程包括:1) 在 Protobuf 中定义 HTTP 映射注解;2) 生成网关代码;3) 同时启动 gRPC 服务和 HTTP 网关服务。该方案解决了 gRPC 二进制协议与前端/传统
2026-04-05 10:36:21
170
原创 Protocol Buffers(.proto)实战入门:Go 生态最常用的接口定义语言
本文介绍了Protocol Buffers(Protobuf)的基本概念和使用方法,重点讲解.proto文件的定义与Go语言实现。主要内容包括:消息(Message)的定义语法与字段类型规则、常用字段规则(repeated/optional/map)、枚举类型、嵌套消息结构;服务(Service)定义与gRPC接口规范;进阶特性如保留字段和文件导入;最后给出Go代码生成命令和最佳实践建议,包括字段编号管理、版本兼容策略和命名规范。作为gRPC的核心基础,Protobuf因其跨语言特性和高性能序列化,成为微服
2026-04-05 09:15:57
204
原创 Go中如何跨语言实现传输? - GRPC
gRPC是Google开源的高性能RPC框架,基于HTTP/2和Protocol Buffers,支持多语言调用。相比RESTful API,它性能更高、接口更规范,适合微服务架构。核心包括: Protobuf定义服务接口和数据结构 支持4种RPC模式:一元、服务端流式、客户端流式、双向流式 开发流程: 编写.proto文件定义服务 生成Go代码 实现服务端逻辑 客户端调用 提供拦截器机制处理通用逻辑 示例展示了一元RPC的实现,包括服务定义、服务端注册和客户端调用。gRPC还支持流式传输和拦截器等高级特性
2026-04-05 08:42:23
554
原创 Git 开发中最常用的命令与场景
本文介绍了Git开发中最常用的命令与场景,包括用户配置、仓库初始化、文件状态管理、提交操作、版本回退、分支管理和远程仓库操作。重点讲解了工作区/暂存区/仓库区的概念,以及add/commit/log/reset等核心命令的使用方法。同时详细说明了分支的创建、切换、合并和冲突解决流程,以及远程仓库的关联、推送、拉取和克隆操作。这些命令涵盖了Git日常开发中的主要需求,适合开发者快速掌握Git的基本工作流程。
2026-04-02 19:10:44
136
原创 原来PHP是这样用Cookie的?
PHP中的Cookie使用指南:Cookie是解决HTTP无状态问题的关键机制,允许服务器通过小段文本信息识别用户。使用setcookie()函数设置Cookie,需注意在输出前调用,可控制有效期、路径、域名和安全选项。通过$_COOKIE超全局变量读取Cookie值,删除则需设置过期时间。为防止篡改,建议对Cookie内容进行签名验证,使用hash_hmac()生成签名并在读取时比对。合理使用Cookie可实现登录状态保持、用户偏好存储等功能,同时注意安全设置如HTTPS传输和禁止JS访问。
2026-04-01 19:40:57
239
原创 PHP 中处理图像的利器 GD库
PHP GD库图像处理摘要 PHP的GD库是强大的图像处理工具,支持生成验证码、缩略图、水印和图表等常见需求。基本操作流程为:创建画布→分配颜色→绘制内容→输出/保存→销毁资源。 核心功能包括: 基础图形绘制:直线、矩形、圆形等 缩略图生成:通过imagecopyresampled实现高质量缩放 水印添加:支持文字和图片水印 验证码生成:结合随机数和干扰元素 GD库操作简单高效,是PHP开发者处理图像的必备工具,适用于各种Web应用场景。
2026-04-01 03:33:35
351
原创 如何使用PHP创建图像验证码
PHP创建图像验证码的实现主要依赖GD库,通过7个步骤完成:1.开启Session并配置参数;2.创建画布并设置颜色;3.生成随机验证码字符串;4.绘制干扰线和噪点;5.使用TTF字体绘制旋转文字;6.存储加密验证码到Session;7.输出PNG图片并销毁资源。关键函数包括imagecreatetruecolor、imagettftext等,通过干扰元素和字体变形增强安全性,最后需设置响应头确保正确显示。验证时只需比对Session中存储的加密值即可。
2026-04-01 02:23:29
309
原创 Go 中最强大的权限控制库(Casbin)
Casbin 是一个强大的 Go 权限控制库,支持 ACL、RBAC、ABAC 等多种访问控制模型。通过模型文件定义权限逻辑,策略文件存储具体规则,执行器(Enforcer)提供权限判断核心功能。ACL 模型直接定义用户-资源-操作关系,适合简单场景;RBAC 模型通过角色中间层管理权限,支持动态角色分配和权限管理,是企业开发常用方案。Casbin 还支持多租户场景的 RBAC with Domains,满足复杂权限需求。其灵活的配置和丰富的存储适配器(Mysql/Redis等)使其成为 Go 生态中最强大
2026-03-30 16:57:33
372
原创 Go 中最主流 JWT 库 jwt -go
JWT(JSON Web Token)是前后端分离项目中最主流的身份认证方案,通过加密Token实现无状态验证,适用于分布式系统和微服务架构。JWT由Header、Payload和Signature三部分组成,支持自定义声明。在Go中,jwt-go库提供核心API:通过jwt.NewWithClaims()生成Token,jwt.ParseWithClaims()解析验证Token,并可作为Gin中间件保护接口。JWT工作流程包括用户登录后生成Token,客户端存储并在请求头中携带,服务器验证后允许访问资源
2026-03-29 10:35:51
450
1
原创 PHP 中的文件读写与上传
本文介绍了PHP中文件操作的核心功能,包括文件判断与信息获取、文件读写、目录操作和文件上传。主要内容:1. 使用file_exists()等函数判断文件属性;2. 通过file_get_contents()和file_put_contents()实现简单读写,或使用fopen()系列函数进行精细控制;3. 目录创建、删除和遍历方法;4. 图片上传处理流程,包括错误检查、类型验证和存储。文章提供了实用的代码示例,涵盖从基础文件操作到实际应用场景的实现要点。
2026-03-28 00:53:12
54
原创 Go 生态最快 JSON 库 - jsoniter
jsoniter 是 Go 生态中性能最快的 JSON 编解码库,比标准库 encoding/json 快 3-10 倍。它完全兼容标准库 API,支持零成本替换,同时提供高性能便捷 API(如 MarshalToString 和部分解析功能)以及底层 Iterator/Stream API 满足极致性能需求。支持全局配置忽略未知字段,适用于高并发、大数据量场景,是 Go 后端开发的首选 JSON 处理方案。
2026-03-27 23:25:33
587
原创 GORM 实战入门:从环境搭建到企业级常用特性全解析
本文介绍了Go语言主流ORM框架GORM的实战入门指南。主要内容包括:环境搭建与MySQL数据库连接配置,重点讲解了DSN参数和连接池优化;模型定义规则,详细说明结构体与数据库表的映射方式及常用gorm Tag属性;CRUD操作基础,涵盖创建记录的多种API及其特点。文章强调开发与生产环境的配置差异,提供性能优化建议,适合Go开发者快速掌握GORM的核心功能,为构建企业级应用奠定基础。
2026-03-27 20:43:07
439
原创 PHP 引入 PHP
PHP提供了四种文件引入方式:include、require及其_once变体。include宽松处理错误,require严格处理;*_once版本避免重复引入。最佳实践包括:必需文件用require,函数/类用*_once,使用__DIR__构建绝对路径,生产环境隐藏错误。典型应用场景包括视图模块化和类自动加载。
2026-03-26 23:52:26
308
原创 PHP mysqli 实用开发指南
《PHP mysqli 实用开发指南》摘要: 本文介绍了PHP中MySQLi扩展的核心使用方法,包含连接数据库、执行查询、数据操作和安全防护等关键内容。重点讲解了面向对象和过程化两种编程风格,详细说明了查询数据的多种获取方式(fetch_assoc/fetch_object等),以及插入、更新、删除数据的标准流程。特别强调了预处理语句的重要性,通过bind_param绑定参数有效防止SQL注入攻击。文章提供了大量实用代码示例,包括获取自增ID、受影响行数等开发常见需求,是PHP数据库开发的实用参考手册。
2026-03-26 21:14:29
542
原创 php 如何使用mysqli连接mysql
本文介绍了如何使用PHP的mysqli扩展连接MySQL数据库。首先通过命令行检查是否加载了mysqli扩展,若未加载则需要找到php.ini配置文件并取消extension=mysqli的注释。如果扩展未安装,提供了针对Ubuntu/Debian、CentOS/RHEL、macOS和Windows等不同系统的安装方法。最后强调修改配置后必须重启PHP服务器才能使更改生效。文章提供了详细的命令行操作步骤,帮助开发者快速解决mysqli扩展的连接问题。
2026-03-26 18:31:31
513
原创 Gin 日志体系详解
Gin日志体系解析 本文系统介绍了Gin框架的日志处理方案,从原生日记功能到企业级日志工具集成。Gin默认提供基础日志中间件Logger和Recovery,支持请求信息记录和panic恢复,但存在结构化不足、级别控制弱等问题。针对生产环境需求,重点推荐Uber开源的Zap日志库,具备高性能、结构化JSON输出、精细级别控制等优势,并提供完整的集成代码示例,包括日志切割、多输出配置等企业级功能实现方案。文章还对比了Logrus等替代方案,为不同场景提供选型建议,解决Gin开发中的全日志需求。
2026-03-26 01:30:32
571
原创 Gin 实战入门:从环境搭建到企业级常用特性全解析
本文介绍了Go语言高性能Web框架Gin的实战入门指南,重点讲解了企业级开发中的常用特性。主要内容包括:环境搭建与第一个Gin服务的创建,详细说明了路由定义和HTTP方法的使用;高频场景下的参数获取方法,涵盖路径参数、Query参数和Form表单参数三种常见传参方式;并提供了完整的代码示例和语法说明。文章面向有Go语言基础的开发者,所有代码均可直接运行,适合快速上手Gin开发。
2026-03-26 00:34:54
461
原创 Gin 接收前端传参方式有几种?
Gin 接收前端参数的几种方式: 路径参数:通过 c.Param() 获取 RESTful 风格的 URL 参数 查询字符串:使用 c.Query() 或 c.DefaultQuery() 获取 URL 查询参数 表单数据:通过 c.PostForm() 或 c.DefaultPostForm() 获取表单提交数据 JSON 数据:使用 c.ShouldBindJSON() 绑定 JSON 请求体到结构体 文件上传:通过 c.FormFile() 和 c.SaveUploadedFile() 处理文件上传
2026-03-25 23:50:02
432
原创 从依赖到自主:手写一个 ICO 文件转换器
本文介绍了如何从零实现一个ICO文件转换器,避免使用存在安全风险的第三方库。文章首先分析了依赖第三方库的三大问题:安全隐患(如CVE漏洞)、依赖黑洞和功能过剩。然后详细解析了ICO文件格式,包括6字节的文件头、16字节的目录条目和PNG图像数据三部分结构。最后提供了核心实现思路:验证PNG输入、计算偏移量、构建文件头和目录,最终拼接数据。作者用不到200行代码实现了一个轻量级转换器,既提升了安全性又减少了不必要的依赖。
2026-03-24 22:13:40
480
原创 JS 最常用的性能优化 防抖和节流
本文介绍了JavaScript中两种常用的性能优化技术:防抖和节流。防抖的核心是等待事件停止触发后再执行(如搜索框输入停止后发送请求),通过setTimeout实现重新计时。节流则是在持续触发事件时固定间隔执行一次(如滚动页面时定期更新位置),可采用时间戳或定时器实现。两种技术都能有效减少高频事件带来的性能损耗,防抖适用于后端请求场景,节流更适合前端渲染优化。文中提供了代码实现和典型应用示例,帮助开发者理解并应用这两种优化方案。
2026-03-24 15:57:17
313
原创 JS中的两大定时器
JavaScript中有两种定时器:setTimeout(一次性定时器)和setInterval(循环定时器)。setTimeout在指定延迟后执行一次,而setInterval会重复执行直到手动清除。定时器属于宏任务,执行优先级低于同步代码和微任务(如Promise和async/await)。使用clearTimeout和clearInterval可取消定时器,避免内存泄漏。定时器与微任务的区别体现在事件循环中,微任务优先于宏任务执行。典型执行顺序为:同步代码 > 微任务 > 宏任务(定时器)
2026-03-24 15:08:33
584
原创 搞懂 Event:是什么、有什么用、用在哪、解决什么问题
JS中的Event对象是事件驱动模型的核心,它能精准捕获用户操作细节并解决交互问题。通过e.target、e.key等属性可获取点击元素、按键信息等;使用e.preventDefault()和e.stopPropagation()方法可阻止默认行为和事件冒泡。Event常用于动态列表事件委托、表单验证、快捷键操作、弹窗关闭和鼠标跟随等场景,如通过e.target判断点击元素、e.key识别回车提交、e.offsetX获取鼠标位置等。这些特性使开发者能精确控制用户交互行为。
2026-03-24 14:42:40
472
原创 DOM 事件:onclick VS addEventListener(‘click‘)区别
DOM事件处理中,onclick和addEventListener('click')的主要区别在于:1)onclick只能绑定单个事件处理器,后者支持多个;2)移除方式不同,onclick设为null即可,后者需用removeEventListener且必须传入相同函数引用;3)事件阶段控制,onclick仅支持冒泡阶段,后者可选择捕获或冒泡阶段。现代开发推荐使用功能更强大的addEventListener,仅在快速测试等简单场景使用onclick。
2026-03-24 02:10:33
178
原创 [特殊字符] JS Date 对象8大使用场景
本文总结了JavaScript Date对象的8个核心使用场景,包括:获取当前时间、指定时间、获取年月日时分秒等基础方法;时间格式化技巧;获取时间戳的两种方式;计算时间差和倒计时功能实现;判断是否为当天;时间相对描述转换(如"几分钟前");以及获取当月首末日期的方法。这些方法涵盖了日常开发中最常用的日期处理需求,特别是格式化、时间差计算和倒计时等实用功能,为开发者提供了全面的日期操作参考方案。
2026-03-23 21:36:31
76
原创 JS Math 对象 完全讲解
JavaScript中的Math对象提供了一系列数学计算方法,无需实例化即可直接使用。常用方法包括:生成0-1随机数的random(),四舍五入的round(),向上/向下取整的ceil()/floor(),取绝对值的abs(),获取最大/最小值的max()/min(),进行幂运算的pow(),开平方的sqrt(),以及圆周率常量PI。这些方法可满足基本数学运算需求,如随机数生成、数字取整、数值比较等,是JavaScript开发中常用的数学工具。
2026-03-23 21:15:49
43
原创 Js常用数组处理
forEach()遍历数组,替代for循环 Array.isArray()判断是否为数组 push()在末尾添加元素 shift()删除首个元素 unshift()在开头添加元素 join()将数组转为字符串 reverse()颠倒数组顺序 indexOf()查找元素位置 这些方法涵盖了数组的遍历、增删、转换和查找等常见操作,是处理数组的基础工具。
2026-03-23 21:00:34
55
原创 Js常用的字符串处理
本文介绍了JavaScript字符串常用方法的核心特性与使用场景。所有字符串方法均不会修改原字符串,而是返回新字符串。重点方法包括:charAt()获取指定位置字符、concat()拼接字符串、substring()和slice()截取子串、indexOf()查找子串位置、trim()去除空白字符、split()分割字符串为数组。特别推荐优先使用slice()方法进行截取操作,因其支持负数索引更灵活。这些方法广泛应用于表单验证、文本处理、数据解析等场景,是JavaScript字符串操作的基础工具。
2026-03-23 20:07:55
335
原创 一文掌握 Go fmt:最常用的字符串与字节串操作总结
本文总结了Go语言fmt包中最常用的字符串与字节串操作方法。字符串操作包括fmt.Sprint直接拼接、fmt.Sprintf格式化拼接以及fmt.Println打印输出;字节串操作提供了fmt.Append、fmt.Appendf等高效拼接方法,特别适用于网络编程。文章还介绍了字符串与字节切片互转的方法,并列举了常用的格式化占位符。这些方法涵盖了日常开发中字符串处理的主要需求,是Go开发者必备的基础技能。
2026-03-20 00:33:27
231
原创 实践刘丹冰的即时通讯系统
本文介绍了基于Go语言构建即时通讯系统的实践过程。系统分为两个版本迭代:V0.1实现基础TCP服务端搭建,包括监听端口、接收连接和并发处理;V0.2新增用户上线广播功能,通过用户抽象模块(User)和服务端升级(OnlineMap管理、消息广播)实现多人感知。核心亮点包括协程并发处理、读写锁保证线程安全、通道实现消息广播等Go语言特性应用,为后续扩展即时通讯功能奠定了基础。
2026-03-16 18:43:45
366
原创 C++ 中 单引号 ‘‘ 和 双引号 ““ 到底有什么区别?
C++中单引号('')和双引号("")的区别在于:单引号表示单个字符(char类型,1字节),如'a';双引号表示字符串(const char*类型),如"a"实际上是2字节('a'+'\0')。单引号只能包含1个字符,双引号可包含任意长度字符串。使用时需注意类型匹配,如在unordered_map<char,>中用"a"会报错,必须用'a'。内存中,'a'占1字节,"a"占2字节(包含结束符)。
2026-03-14 23:15:45
39
原创 如何使用WebSocket实现一个公域聊天室?
本文介绍了如何使用WebSocket实现一个公域聊天室。核心功能包括:所有用户在同一房间内交流、用户进出通知、多人同时在线互不阻塞。关键技术点:1) WebSocket长连接实现实时通讯;2) Go协程处理并发连接;3) 全局客户端列表+广播机制;4) sync.Mutex保证线程安全。文章详细展示了Go语言实现代码,包括HTTP升级WebSocket、用户注册/注销、消息广播等核心功能,并提供了完整的代码示例。这种实现方式适用于需要实时交互的多人聊天场景。
2026-03-14 20:43:13
165
原创 Golang中实时推送的功臣 - WebSocket
WebSocket是基于TCP的双向长连接通信协议,解决了HTTP短连接无法实现服务端主动推送的问题。它支持客户端和服务端随时互相发送消息,适用于实时推送、聊天、直播等场景。Go语言中可使用gorilla/websocket库实现WebSocket服务:先通过Upgrader将HTTP连接升级为WebSocket长连接,然后使用ReadMessage/WriteMessage进行消息收发,还支持直接处理JSON数据。相比HTTP,WebSocket具有长连接、低延迟、轻量级等优势,是实现实时通信的理想选择。
2026-03-14 18:17:15
311
原创 Go中的泛型与any、interface有什么区别?
Go语言中any(即interface{})与泛型的区别: any是万能容器,可存储任意类型但会丢失类型信息,使用时需要类型断言 泛型通过类型参数[T int|string]保留类型信息,编译时检查保证类型安全 使用场景: any适合仅需存储传递数据而不关心具体类型的场景(如日志打印) 泛型适合需要对数据进行操作且需要类型安全的场景(如通用算法) 典型对比: 泛型加法函数Add[T int|float64]可直接运算 any实现加法需要繁琐的类型断言且不安全 泛型提供了更好的类型安全和代码复用性,而any更
2026-03-14 16:35:30
264
原创 如何让两个Go程序远程调用?
Go语言通过net/rpc包实现远程程序调用(RPC),使开发者可以像调用本地函数一样调用远程服务。该包要求服务方法遵循特定签名规则:方法所属类型和名称需导出,接收两个参数(第二个为指针类型),并返回error类型。示例展示了如何实现一个远程乘法计算器,服务端注册MathService结构体并监听端口,客户端通过Dial连接后调用Multiply方法获取结果。虽然标准库RPC已冻结,但该模式为理解现代RPC框架(gRPC等)提供了基础,演示了Go实现跨进程通信的核心机制。
2026-03-14 14:36:57
318
原创 Go 标准库 net/http 包都能干嘛?
Go语言的标准库net/http提供了HTTP服务端和客户端的实现。服务端方面,它支持路由注册(HandleFunc)、监听服务(ListenAndServe)、处理请求和响应(ResponseWriter和Request),并展示了GET/POST请求处理、JSON返回、静态文件服务等常见用法。客户端方面,提供了简单的Get/Post方法和可定制的Client结构。文档还比较了使用默认DefaultServeMux和自定义ServeMux的优缺点,后者更安全灵活。这个标准库让开发者无需第三方依赖就能构建完
2026-03-13 20:32:50
380
原创 Go 网络编程实战:构建一个最小可用的 TCP 交互程序
本文介绍了一个基于Go语言的TCP网络编程实例,包含服务端和客户端实现。服务端监听8888端口,支持并发处理多个客户端连接,提供回声功能(原样返回客户端消息)和特殊命令响应(如返回客户端IP地址)。客户端可主动连接服务端,通过命令行交互发送消息并接收响应。 关键实现点: 服务端使用goroutine并发处理连接 通过net包实现TCP通信基础功能 包含连接建立、数据传输和断开处理的完整流程 实现了基本的异常处理和资源释放 这个示例展示了Go语言进行网络编程的基本模式,适合作为学习TCP通信和并发处理的入门实
2026-03-13 02:09:37
387
2
原创 Go中的Tcp编程为什么总是能看到handle?
在TCP编程中,handle/handler是专门处理特定事件/请求的函数或接口。它分离了框架层(网络通信)和业务逻辑层,使代码结构更清晰。handler通常处理新连接、数据包和异常情况,其命名源自英语"处理"之意,并已成为行业通用术语。在Go中,handler可以定义为函数或接口(如TCPHandler),通过控制反转实现不同业务逻辑的解耦。这种命名方式语义精准、职责明确,且符合Go标准库的命名习惯(如http.Handler),是TCP编程中的常见模式。
2026-03-11 13:10:09
632
原创 golang的fs除了定权限还能干什么?
Golang的fs包提供了文件系统操作的通用接口,核心是fs.FS接口,只需实现Open()方法即可作为合法文件系统。相比传统os操作,fs模块更灵活,支持处理任何来源的文件(本地、嵌入等)。常用工具函数包括ReadFile、WalkDir、Stat等,与io包类似但针对文件系统。fs最大优势是与go:embed结合,可将静态文件嵌入二进制程序,便于部署。os、io和fs分工明确:os处理本地文件,io定义数据读写接口,fs定义文件系统操作接口。
2026-03-09 21:36:09
249
【数学建模竞赛】美赛MCM-ICM问题分析与建模框架:2026年赛事摘要报告结构设计
2026-02-01
简历模版 - 个人求职 - Word
2025-08-26
黑马品优购前端Html+CSS的UI
2025-06-27
基于JS实现的简易计算器
2025-06-28
三维热传导问题模拟代码
2025-06-27
数据包络分析(DEA)模型实现
2025-06-27
vscode中css用户代码片段,弹不出来
2024-03-30
{AEB6717E-7E19-11d0-97EE-00C04FD91972}被删了
2024-02-06
安装VS2022,报错1303
2024-02-01
如何在git中的邮箱名称显示出现了乱码情况?
2024-01-31
C++ double类型的问题
2024-01-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅