
golang
文章平均质量分 78
go
阿贾克斯的黎明
不会弹钢琴的程序员不是一个好的电气工程师
展开
-
Go 语言权限管理方案全解析:从基础到高级实践
OAuth2 是一种开放标准的授权协议,常用于第三方应用授权、单点登录(SSO)等场景。用户授权:用户同意第三方应用访问其资源。获取授权码:第三方应用获取授权码。换取令牌:通过授权码获取访问令牌(Access Token)和刷新令牌(Refresh Token)。访问资源:使用访问令牌访问受保护资源。Go 语言生态提供了丰富的权限管理方案,从基础的 RBAC 到复杂的 ABAC、OAuth2,再到微服务场景下的服务网格,开发者可根据项目需求灵活选择。原创 2025-05-18 23:41:32 · 555 阅读 · 0 评论 -
MySQL 表结构变更踩坑记录:存储过程、字符集与字段添加失败原因分析
删除不存在的存储过程是安全操作,报错 “不存在” 可忽略,不影响后续创建。动态 SQL 拼接:使用CONCAT时需注意表名、字段名的引号包裹,避免 SQL 注入风险(本文场景为内部维护,风险较低)。原创 2025-05-18 14:48:20 · 845 阅读 · 0 评论 -
深入 Go 语言开发:goctl、protoc 与 protoc - gen - go 的安装与配置
通过安装和配置goctlprotoc和,我们在 Go 语言开发中就拥有了更强大的工具,无论是处理高效的数据传输(借助protoc),还是快速生成 Go 代码(依赖),亦或是加速项目开发(使用goctl),都能更加得心应手。希望这篇博客能帮助大家顺利掌握这三个工具的安装与配置,在 Go 语言开发之路上走得更顺畅。原创 2025-05-13 20:51:10 · 713 阅读 · 0 评论 -
Go 语言中 context 的深入剖析与应用实践
在后端开发领域,context的应用无处不在,它极大地提升了程序的健壮性和可维护性。从 Web 服务的请求取消、数据库操作的超时控制,到微服务间的请求链路追踪,再到限流熔断和中间件的上下文管理,context都发挥着不可替代的作用。熟练掌握context的使用方法,能够帮助我们更好地应对后端开发中的各种复杂场景,构建出更加高效、稳定的后端服务系统。原创 2025-05-01 09:57:47 · 594 阅读 · 0 评论 -
Goctl 中 RPC 相关命令全面解析与实践
命令用于快速创建一个全新的 RPC 服务项目。它会自动生成一系列必要的文件和目录结构,包括服务定义文件(.proto)、服务端代码、客户端代码等,为后续的开发提供了一个良好的基础。命令的作用是根据已有的.proto文件生成对应的 Go 语言代码。它能够解析.proto文件中定义的服务、消息等结构,并生成相应的 gRPC 代码,包括服务端和客户端的代码。指令用于生成指定名称的.proto文件。它会根据默认的模板生成一个示例.proto文件,其中包含基本的服务定义结构,方便我们在此基础上进行修改和完善。原创 2025-04-29 01:30:35 · 764 阅读 · 0 评论 -
Go 语言测试中的接口类型:让测试更简单、更灵活
在 Go 语言测试中,接口类型就像是一把万能钥匙,为我们打开了通往高效、灵活测试的大门。通过合理地使用接口,我们可以轻松地解耦代码依赖,实现多态性,让测试更加独立、可靠和易于维护。无论是小型项目还是大型的企业级应用,掌握接口类型在测试中的应用技巧,都能让我们的开发工作事半功倍。希望通过本文的介绍,你能对 Go 语言测试中的接口类型有更深入的理解和认识,并在实际项目中充分发挥它的强大威力。快乐编码,高效测试,让我们一起在 Go 语言的世界里畅游!原创 2025-04-26 23:35:16 · 890 阅读 · 0 评论 -
数据库时间字段那些 “坑”:从0000-00-00错误到类型匹配问题
数据库层面非必要不关闭严格模式(保持数据合法性)。根据精度需求选择字段类型(TIMESTAMPvs代码层面初始化时间字段时,用time.Now()或明确赋值,避免零值。更新数据时,显式指定字段,避免意外修改时间字段。测试层面用合法时间值覆盖测试用例(如验证精度时,打印数据库存储的原始值(如通过 SQL 查询确认是否保留了毫秒)。原创 2025-04-25 00:34:18 · 892 阅读 · 0 评论 -
解决 GORM 操作 MySQL 时的 Error 1170 和 Error 1062 错误
import ("time"not null"`not null"` // 存储bcrypt哈希(60字符)not null"`CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime:milli"` // 自动生成创建时间(毫秒级)UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime:milli"` // 自动更新时间(毫秒级)原创 2025-04-21 21:30:25 · 759 阅读 · 0 评论 -
GORM Gen还是太全面了
/ user 用户表userDo userDo // 内嵌GORM生成的基础操作结构体// 以下是数据库表字段的Go语言映射ALL field.Asterisk // 代表所有字段(*)ID field.Int64 // 用户ID(对应数据库id列)Username field.String // 用户名(对应username列)// ...其他字段...fieldMap map[string]field.Expr // 字段名映射表(用于通过字符串动态获取字段表达式)核心设计。原创 2025-04-19 11:23:11 · 752 阅读 · 0 评论 -
GORM Gen 使用全攻略:提升 Go 数据库开发效率
GORM Gen 提供了丰富的配置选项,让我们可以根据项目需求进行定制。OutPath: "./dal/query", // 查询代码输出目录ModelPkgPath: "./dal/model", // 模型代码输出目录// 字段可空性配置})设为true时,生成的模型字段会根据数据库表结构中的可空性进行标记;和则会为模型字段添加索引标签和类型标签,方便在 GORM 操作中使用。如果只需生成特定表的代码,可以使用方法指定表名。// 生成特定表。原创 2025-04-05 16:50:07 · 992 阅读 · 0 评论 -
go语言根据数据库表生成 ORM 代码的几种方法
大多数工具支持自定义模板,你可以根据项目的代码风格和需求,调整生成代码的格式和内容。原创 2025-04-05 16:48:59 · 1025 阅读 · 0 评论 -
Go 关键字全面汇总
在 Go 语言编程中,关键字是被语言保留的具有特殊含义的标识符,不能用作自定义的变量名、函数名、类型名等。以下是对 Go 中所有关键字的全面介绍。原创 2025-03-30 21:16:04 · 746 阅读 · 0 评论 -
Redis 分布式锁的实现原理及 Go 语言实践
通过 Redis 实现分布式锁是一种简单而有效的方式,利用 Redis 的原子操作可以确保在分布式环境下对共享资源的安全访问。本文介绍了 Redis 分布式锁的实现原理,并给出了使用 Go 语言实现的示例代码,希望对你有所帮助。原创 2025-03-08 12:43:57 · 409 阅读 · 0 评论 -
Go 语言实现文件上传至阿里云 OSS
在现代的 Web 应用开发里,文件上传是极为常见的功能需求。而将文件上传到对象存储服务(OSS),如阿里云 OSS,能够帮助我们更好地管理和存储文件,同时减轻服务器的存储压力。本文将详细介绍如何使用 Go 语言实现文件上传到阿里云 OSS 的功能,涵盖前期准备、代码实现以及代码解释等方面。通过以上步骤,你就可以使用 Go 语言实现将文件上传到阿里云 OSS 的功能了。首先,你需要拥有一个阿里云账号,并开通 OSS 服务。创建一个 OSS 存储空间(Bucket),记住其名称和所在的地域(Region)。原创 2025-02-18 22:10:00 · 830 阅读 · 0 评论 -
Go 语言中的权限认证方式汇总
JSON Web Token(JWT)是一种用于在网络应用间安全传输信息的开放标准(RFC 7519)。它通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部包含令牌类型和签名算法等信息;载荷部分携带用户相关信息及声明;签名用于验证令牌的完整性和真实性。客户端登录成功后,服务器返回 JWT,后续客户端请求时需在请求头中携带该令牌,服务器通过验证签名来确认用户身份与权限。原创 2025-02-18 22:01:55 · 799 阅读 · 0 评论 -
Go 语言中 slog 日志库的全面使用指南
slog库允许开发者以结构化的方式记录日志,结构化日志是将日志信息以键值对的形式组织,这样便于后续的日志分析和处理。它支持不同的日志级别(如DebugInfoWarnError),可以轻松地配置日志输出格式(如文本格式、JSON 格式),并且支持自定义日志处理程序。slog允许我们自定义日志处理程序,以满足特定的需求。import ("log/slog""os""strings"// PrefixHandler 是一个自定义的日志处理程序,用于在每条日志前添加前缀。原创 2025-02-18 21:57:20 · 946 阅读 · 0 评论 -
Consul 在 Go 语言微服务中的注册与发现应用
Consul 是由 HashiCorp 公司开发的一个分布式、高可用的服务发现和配置管理工具。服务发现:允许服务将自身注册到 Consul 中,并通过 Consul 发现其他服务的位置。健康检查:可以定期检查服务的健康状态,当服务不健康时,自动将其从服务列表中移除,避免请求发送到故障服务。键值存储:提供了一个简单的键值对存储系统,可用于存储配置信息等。多数据中心:支持在多个数据中心之间进行服务发现和配置同步。原创 2025-02-18 21:51:23 · 602 阅读 · 0 评论 -
Go 语言 Gin 框架:处理 URI 参数绑定与空指针异常问题
在使用 Gin 框架处理 URI 参数绑定时,要注意变量类型的正确使用,特别是指针类型。虽然指针可以提供更灵活的内存操作,但也容易引发空指针异常。通过合理的代码设计和错误处理,可以有效地避免这些问题,提高代码的健壮性和稳定性。希望本文能帮助你更好地理解 Go 语言中指针的使用和空指针异常的处理,在实际开发中少走弯路。原创 2025-02-06 19:45:43 · 423 阅读 · 0 评论 -
Go 语言应用测试全攻略:从单元到集成
通过单元测试、集成测试和端到端测试这三种方式,我们可以全面、深入地测试 Go 语言应用的功能,确保应用在不同层面上都能正常工作。单元测试帮助我们验证代码的基本功能,集成测试关注模块之间的交互和协作,而端到端测试则从用户的角度出发,验证整个应用的流程是否正常。在实际项目中,建议根据项目的规模和复杂度,合理选择和组合这些测试方式,构建完善的测试体系,提高项目的质量和稳定性。希望本文能对你在 Go 语言应用测试方面有所帮助,让你能够更加自信地开发和维护高质量的 Go 项目。原创 2025-01-25 23:11:06 · 994 阅读 · 0 评论 -
Go 语言与 Go Zero 框架:从流行趋势到企业级微服务实战
Go Zero 是一个基于 Go 语言开发的轻量级、高性能的微服务框架。它提供了一系列的工具和库,旨在帮助开发者快速构建健壮、可扩展的微服务应用。Go Zero 集成了 RPC 框架、RESTful API 框架、缓存组件、数据库访问组件等,为微服务开发提供了一站式解决方案。在 MySQL 中创建usersGo 语言凭借其多方面的优势,在软件开发领域的地位日益重要,而 Go Zero 框架则进一步简化了微服务的开发过程。原创 2025-01-24 22:50:46 · 1035 阅读 · 0 评论 -
Go 语言中的结构体设计:解析 code、message 和 data 字段
首先,我们将代码组织在types包中,这有助于将相关的类型进行分组,方便代码的管理和导入。这种结构体设计模式在 Go 语言的 API 开发中非常实用,它允许我们在保持代码一致性和可维护性的同时,根据不同的 API 操作灵活地调整数据结构。使用通用的结构体作为基础,我们可以方便地创建各种不同的请求和响应结构体,满足不同 API 操作的需求,同时充分利用 Go 语言的结构体嵌入特性和 JSON 标签,实现简洁而强大的 API 开发。原创 2025-01-23 01:36:30 · 1205 阅读 · 0 评论 -
Go 语言中接口实现错误分析:customUserModel 未完全实现 UserModel 接口
UserModel接口定义了四个方法,分别用于插入用户数据、查找单个用户信息、更新用户信息以及删除用户信息。其中,FindOne和Delete方法的id参数类型为int64。原创 2025-01-23 01:36:17 · 327 阅读 · 0 评论 -
深入探索 Go-Zero 之 sqlx 库:高效的 SQL 操作指南
库为我们提供了一种高效、便捷的方式来进行 SQL 操作。通过本文的介绍,你应该已经掌握了如何使用这个库进行数据库连接、CRUD 操作以及事务管理。在实际项目中,合理运用这些知识可以帮助你快速构建稳定、高效的数据库驱动应用程序。希望本文能对你理解和使用sqlx库有所帮助,如果你在使用过程中遇到任何问题,欢迎在评论区留言讨论。原创 2025-01-23 01:34:37 · 529 阅读 · 0 评论 -
深入理解 Go 语言中 GORM 的 结构体:显示与隐式特性
首先,让我们来看一下Paymentimport (// Payment 结构体,定义了支付信息的数据模型gorm.ModelID这里使用ID字段并通过标签将其标记为主键。这是一个显示的操作,告诉 GORM 该字段是数据库表的主键。在进行数据库操作时,GORM 会将这个字段作为主键使用,例如在CreateUpdateDelete和Find操作中,都可能基于这个主键进行。在使用 GORM 时,我们的Payment结构体展现了丰富的显示和隐式特性。原创 2025-01-22 00:31:09 · 526 阅读 · 0 评论 -
解决 Go 项目中模型与类型结构体重复的痛点
将Payment的公共部分提取出来,放到一个单独的包或文件中,然后让model和types中的Payment结构体嵌入这个公共结构体。Payment在 Go 项目中,通过采用上述的解决方案,我们可以有效地解决model和types中结构体重复的问题。每种方案都有其独特的优点,可以根据项目的具体情况和需求进行选择,也可以综合使用这些方案,以达到最佳的代码结构和性能。例如,可以使用共享结构体来减少冗余,同时使用转换函数或映射工具来确保数据在不同层之间的正确转换,使用接口来提高代码的可扩展性和可测试性。原创 2025-01-22 00:25:21 · 605 阅读 · 0 评论 -
探索 Gin 面试题:从基础到实战
如何在Gin中定义带参数的路由:通过:param语法实现,如router.GET("/user/:id",func(c*gin.Context){id:=c.Param("id")//获取参数并处理}),能灵活捕捉URL中的动态值,适用于根据ID查询用户等场景。简述Gin框架的特点:Gin是轻量级、高性能的HTTPWeb框架,它采用了HTTP路由器的设计,基于Radix树实现快速路由匹配,能高效处理大量请求。一、Gin基础概念。原创 2025-01-19 23:42:27 · 356 阅读 · 0 评论 -
深入理解 protoc 与 Go 语言结合的命令使用
通过对protoc与 Go 语言结合的命令深入了解,我们知道了如何通过不同的选项来精确控制生成代码的输出路径和导入路径。--go_opt=paths=source_relative和--go-grpc_opt=paths=source_relative这两个选项在确保项目代码的可移植性和可维护性方面起到了重要作用。合理运用这些命令和选项,能够帮助我们在使用 protobuf 和 gRPC 进行 Go 语言开发时,更加高效地构建和管理项目。希望本文能为大家在相关技术的学习和实践中提供有价值的参考。原创 2025-01-12 16:03:31 · 1053 阅读 · 0 评论 -
Go-Zero 框架中的内存存储(inmem)与 Redis 的对比
Redis 是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis 支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)与范围查询、位图(bitmaps)、超日志结构(hyperloglogs)和地理空间(geospatial)索引半径查询。原创 2025-01-11 10:22:33 · 437 阅读 · 0 评论 -
Go 语言中把方法作为参数传入
首先,我们需要明确在 Go 语言中函数也是有类型的,函数类型由它的参数列表和返回值列表共同决定。// 定义一个函数类型,它接受一个int类型参数,返回一个int类型值这里定义的IntFunc就是一种函数类型,后续我们就可以按照这个类型来声明变量、传递参数等操作。原创 2025-01-10 19:11:12 · 375 阅读 · 0 评论 -
深入探索 Go 语言中的断言类型用法
在 Go 语言中,接口是一种非常灵活的抽象类型,它定义了一组方法签名,但不关心具体的实现。然而,当我们从接口取值,想要确切知道这个值对应的具体类型时,就轮到断言类型登场了。断言类型本质上是一种语法机制,用于检查接口变量所指向的实际对象的类型是否符合我们的预期,并在符合的情况下将其转换为对应的具体类型,以便访问该类型特有的属性和方法。原创 2025-01-10 19:10:52 · 981 阅读 · 0 评论 -
深入剖析 Go 并发编程中的死锁问题及解决方案
在 Go 并发编程中,避免死锁的关键在于正确使用 sync 包中的工具(如 WaitGroup、Mutex、RWMutex、Condition 等)以及 Channel。要始终确保资源的正确获取和释放,协程之间的同步和通信逻辑严谨。在编写代码时,仔细检查是否存在可能导致死锁的情况,如计数器不匹配、加锁未解锁、缺少消费端或生产端等问题。通过深入理解这些常见的死锁场景和对应的解决方案,能够显著提升 Go 并发程序的可靠性和性能。原创 2025-01-08 13:32:20 · 961 阅读 · 0 评论 -
Go 语言中 defer 关键字的深度剖析
在 Go 语言的编程世界里,defer关键字扮演着至关重要的角色。它的存在为资源管理、异常处理等方面提供了便利且优雅的解决方案。今天,我们就深入探讨一下defer关键字的奥秘。原创 2025-01-08 13:30:40 · 332 阅读 · 0 评论 -
深入剖析 Go 语言中 Map 的并发安全问题及 sync.Map 实现原理
在 Go 语言开发中,数据结构的并发安全性是一个至关重要的话题。今天,我们就来深入探讨一下 Go 中的map以及sync.Map是如何处理并发安全问题的。原创 2025-01-08 13:29:12 · 845 阅读 · 0 评论 -
Goroutine 同步控制详解
通过合理使用 WaitGroup、Mutex 和 Channel 等同步机制,我们可以有效地控制 Goroutine 的执行顺序和对共享资源的访问,避免并发编程中常见的问题,编写高效、可靠的并发程序。在实际应用中,需要根据具体的场景选择合适的同步方式,以达到最佳的性能和效果。原创 2025-01-08 13:26:45 · 910 阅读 · 0 评论 -
Goroutine 同步控制全解析
在并发编程中,多个 goroutine 访问共享资源时可能会引发数据不一致等问题,此时同步控制就显得至关重要。本文将详细介绍在 Go 语言中实现 goroutine 同步控制的几种常见方式,并附上相应代码示例。原创 2025-01-08 13:24:25 · 744 阅读 · 0 评论 -
atomic应用场景
Atomic 主要应用于多线程并发访问共享变量的场景,用于确保对变量的操作是原子性的,避免数据不一致和竞态条件。方法可以确保每个线程对计数器的读写操作是原子性的,保证数据的一致性。在一些需要对共享资源进行复杂操作且依赖于旧值的场景中,在实际应用中,比如在一个多线程的计数器程序中,多个线程可能会同时对计数器进行增加操作。方法就非常关键,它可以避免因并发导致的错误计算和赋值。操作,可能会出现数据错误。原创 2025-01-08 13:22:03 · 293 阅读 · 0 评论 -
深入剖析 sync.Map 数据写入流程与源码解析
sync.Map本质上是对普通map的封装,其设计目的是为了解决并发场景下普通map的不安全问题,并针对特定用例进行了优化,从而在多线程环境中能够高效、安全地进行数据操作。原创 2025-01-08 13:18:28 · 672 阅读 · 0 评论 -
深入剖析 sync.Map 的数据读取流程与源码解读
sync.Map主要针对两种常见用例进行了优化:一是对给定键值对应的条目只写入一次但会多次读取的场景;二是多个go rout对互不相交的键集合进行读取、写入以及覆盖操作的情况。其底层基于普通map实现,通过一系列复杂的机制保证了线程安全。原创 2025-01-08 13:16:09 · 678 阅读 · 0 评论 -
sync.map 的数据结构以及read 和 dirty 的转化关系
在上述代码中,首先创建了一个 sync.Map 对象,然后进行了添加、访问、删除和再次添加键值对的操作,最后遍历了 sync.Map 中的所有键值对。在实际应用中,sync.Map 常用于多个 Goroutine 同时读写共享的映射数据场景,如缓存系统、配置管理等,能够在保证并发安全的前提下提高性能。例如,在一个 Web 服务器中,可以使用 sync.Map 来存储和管理会话信息,多个请求处理 Goroutine 可以并发地读写会话数据,而无需担心数据竞争问题。原创 2025-01-08 13:14:00 · 459 阅读 · 0 评论 -
深入理解 Go 语言中的 sync.Map 与 Map
通过对sync.Map和map的详细对比、sync.Map内部结构与工作机制的深入剖析以及使用场景的介绍,我们可以看到sync.Map在处理并发安全的键值对数据时具有独特的优势。在实际编程中,我们需要根据具体的场景来选择合适的数据结构。如果是在单线程环境或者不存在并发读写冲突的情况下,普通的map已经足够高效。但在并发编程中,特别是读多写少或者多个goroutine对互不相交键集合操作的场景下,sync.Map能够提供更好的性能和线程安全性。希望本文能够帮助读者深入理解sync.Map和map。原创 2025-01-07 19:35:06 · 907 阅读 · 0 评论