深度剖析golang中的sync包
目录简介MutexRWMutexWaitGroupOnceCondMapPool简介
golang的sync包提供了一些并发控制的工具,在应用程序开发过程中是非常有用的,下面详细介绍下这些工具的原理和使用在介绍工具之前,先讲解下内存模型中的happens-before关系
// 示例:Happens-Before关系
var a string
var done bool
func setup() {
a = "hello, wo ...
Golang slice原理深度解析与面试指南
目录slice 基础结构核心特性内存布局示例slice 扩容机制扩容触发条件扩容策略源码(基于nextslicecap)扩容策略详解内存分配优化append 操作原理append 的返回值机制深层原因:值传递 vs 内存共享内存模型分析函数参数传递机制值传递的详细流程什么情况下会影响原数据?高频面试题解析面试题1:底层数组的共享与隔离面试题2 ...
Golang实现结构体和Json格式数据之间的互相转换
目录摘要1. 结构体到json格式1.1 简单转换1.2 递归转换2. json格式到结构体2.1 简单转换2.2 嵌套JSON格式数据转换摘要
本节主要学习Golang结构体和JSON序列化数据的转换命令。
1. 结构体到json格式
1.1 简单转换
Golang结构体转换成JSON格式数据,主要在结构体的相关字段中加入json : "keyword"字段。具体做法如下:
type S ...
Go语言快速搭建一个API流式回复本地模拟接口
目录功能亮点完整代码(mock_coze.go)使用方法自定义回复内容总结在开发 Coze Bot 相关的前端功能时,我们经常需要测试流式回复(SSE)的打字机效果、加载状态、停止响应、内容渲染等逻辑。但直接调用真实的 Coze API 会消耗 token,而且回复速度和内容不可控。
下面分享一个纯 Go 实现的本地模拟接口,只需几分钟就能跑起 ...
Golang实现基于角色的访问控制(RBAC)的项目实践
目录一、RBAC 核心模型设计二、RBAC 核心逻辑实现RBAC 管理器定义基础 CRUD:添加用户 / 角色 / 权限核心:权限校验逻辑三、结合 HTTP 中间件集成 RBAC权限校验中间件完整使用示例四、生产环境优化持久化存储缓存优化性能与并发扩展:RBAC 高级特性RBAC(Role-Based Access Control)是基于角色的访问控制,核心思想是:用 ...
Golang defer 延迟函数的方法实践
目录执行顺序与后进先出(LIFO)原则参数预计算特性与 panic 的关系资源管理的最佳实践避免常见陷阱性能与资源管理在 Go 语言中,defer 关键字用于延迟执行函数调用,常用于资源释放、错误处理和清理操作。以下是 defer 的关键使用注意事项:
&zw ...
Golang查询MongoDB的实现步骤
目录使用 Golang 向 MongoDB 插入文档使用 Golang 向 MongoDB 写入多个文档使用 Golang 从 MongoDB 中查找单个文档获取最后创建的文档使用 Golang 从 MongoDB 中查找所有文档查找符合条件的多个文档在查找操作中使用Projection使用 Golang 更新 MongoDB 中的单个文档如何在 MongoDB 中返回更新的文档?使用 Golang 从 Mongo ...
golang微服务框架Kratos实现消息队列
目录什么是消息队列为什么要使用消息队列1. 异步2. 削峰3. 解耦Kratos与消息队列kratos-transport的应用1. Codec 编解码器2. Broker 消息队列客户端3. Server 封装给Kratos的Server实现具体的应用实例kratos-cqrskratos-realtimemapkratos-chatroom中间件代码什么是消息队列
MQ就是消息队列,是Message Queue的缩写。消息队 ...
golang中go race使用
目录多线程/协程中的线程安全分析死锁竞争Go 的命令中,-race参数用于启用竞态检测器(Race Detector)使用示例注意多线程/协程中的线程安全分析
在项目中,使用多线程会导致线程安全问题,引发bug发生,如果是运行中发生问题更难定位
常见的情况有两种 死锁 竞争,例如
死锁
编译打包时,死锁发生 go run 会直接报错
两个或 ...
golang WebDav 多目录文件服务的实现
目录普通WebDav服务一个端口共享多用户/多目录golang官方提供了webdav服务包,但是,功能比较有限,这里主要针对一个端口,多目录做解释
普通WebDav服务
package main
import (
"net/http"
"golang.org/x/net/webdav"
)
func main() {
http.ListenAndServe(":8080", &webdav.Handler{
FileSystem: we ...
GoLang五种字符串拼接方式小结
目录1.+ 操作符拼接工作原理性能特点适用场景2.fmt.Sprintf工作原理性能特点适用场景3.strings.Builder工作原理性能特点内部机制适用场景4.bytes.Buffer工作原理性能特点与 strings.Builder 对比适用场景5.strings.Join工作原理性能特点适用场景性能对比总结选择建议最佳实践示例1.+ 操作符拼接
工作原理
每次使用 + 拼接字 ...
golang的csp模型具体使用
目录一、Channel:CSP 模型的 “通信管道”1.1 Channel 的基本特性1.2 简单示例二、为什么需要 Channel?—— 解决共享内存的 “原罪”三、无缓冲 Channel 与有缓冲 Channel:同步与异步的分野3.1 无缓冲 Channel(同步通道)3.2 有缓冲 Channel(异步通道)3.3 核心区别总结四、CSP 模型: ...
Go语言结构体标签(Tag)的使用小结
目录什么是结构体标签?基本语法常见的标签用途1.JSON 序列化/反序列化(最常用)2.数据库操作(SQL/ORM)3.Web 框架表单绑定(Gin 等)4.验证规则(binding/validate)5.XML 编码/解码6.YAML 序列化7.BSON(MongoDB)自定义标签标签的解析规则1.格式规范2.通过反射获取标签3.标签解析示例实际应用场景场景1:API 请求/响应 ...
Golang垃圾回收器执行链路详细分析
目录何时会触发垃圾回收?系统监控申请内存gcStart 干了啥?大体流程迭代标记一些优化总结众所周知,我们现版本的 Go 默认是使用的三色标记法,八股文已经听腻了,来看点源码理解一下 GC 流程。
何时会触发垃圾回收?
系统监控
懂行的都知道,gc 的入口是 gcStart,所以我们只需要顺着他的调用链路向上找,可以知道会有一个 ...
Go泛型中的~struct{}的具体使用
目录一、前置知识:Go泛型的核心痛点与解决方案二、~符号:引入版本与核心目的2.1 ~符号的引入版本2.2 ~符号的核心目的:实现“近似类型匹配”三、struct{}:“零内存”的空结构体特性3.1 struct{}的内存特性验证3.2 struct{}的典型应用场景四、~struct{}:约束含义与实践示例4.1 示例1:精确约束s ...
Go异常处理、泛型和文件操作实例代码
目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文件操作文件读取一次性读取获取当前go文件的路径分片读带缓冲读指定分割符文件写入一次性写文件的打开方式文件复制目录操作四:总结一:异常处理
go的异常处理可能是这门语言唯一的一个诟病了吧
由于 go 语言没有捕获 ...
Go 语言 interface从源码到使用实践指南
目录前言一、什么是 interface?二、interface 的底层实现(源码视角)1. 空接口(interface{})2. 非空接口(带方法的接口)接口赋值的底层过程三、interface 的基本使用1. 接口定义与实现2. 接口组合3. 类型断言4. 类型开关(type switch)四、最佳实践与使用技巧1. 接口设计原则:小而专2. 依赖抽象而非具体3. 合理使用 ...
Golang结合chromedp实现浏览器自动化操作
目录为什么要用 Go 做浏览器自动化?chromedp 是什么最简单示例:打开网页并获得标题chromedp 能做什么自动点击网页按钮自动输入内容等待元素加载执行 JavaScript截图网页批量爬取网页数据chromedp 与 Selenium 的对比更多 chromedp 实战(我可以帮你写)总结当大家提到“浏览器自动化”,第一反应往往是 Python ...
Go使用SM3哈希算法和随机盐实现用户密码加密
目录前言一、为什么要加盐 (Salt)二、SM3 哈希算法三、Go 实现用户密码加密1. 生成随机盐2. SM3 哈希函数3. 生成哈希密码4. 验证密码5. 可扩展支持多种算法四、完整示例五、小结前言
在现代 Web 系统中,用户密码安全存储是非常关键的一环。传统做法用简单哈希,容易受到彩虹表攻击。
本文将介绍如何使用 SM3 哈希算法 + 随 ...
Go语言结构体的使用小结
目录概述结构体的定义结构体的实例化直接初始化使用字面量使用 new 关键字结构体的方法结构体的嵌套总结概述
Go 语言,又称 Golang,是由 Google 开发的一种静态强类型、编译型、并发型、具有垃圾回收功能的编程语言。在 Go 语言中,结构体(struct)是一种重要的数据类型,它允许开发者将多个数据项组合成一个单一的复合数 ...