![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Golang系列知识讲解
文章平均质量分 64
路多辛
分享编程知识与经验
展开
-
如何理解 Go 语言中的 top-level 声明?
在 Go 语言中,“top-level”这个术语通常指的是与包(package)直接相关的代码结构和声明,而不是嵌套在函数或方法内部的代码。top-level 代码包括变量、常量、类型、函数和方法的声明,这些都是在包的最顶层作用域中定义的,因此任何包内部的代码都可以访问它们。理解 top-level 结构对于编写清晰、组织良好的代码至关重要。文章持续更新中,微信搜索【路多辛】阅读更多优质文章。原创 2024-04-06 08:29:02 · 709 阅读 · 0 评论 -
Go 1.22 中的 for 循环新特性详解
在 Go 语言中,for 循环是实现迭代的主要方式。Go 中的 for 循环非常灵活,有多种使用方式,包括传统的三部分 for 循环、类似于其他语言中的 while 循环以及迭代集合的 range 循环。在 1.22 之前的版本中,for 循环的变量只创建一次,在每个迭代中为这个变量赋予对应的值。由于这个特性,使用起来很容易犯错,一不小心就会导致意想不到的行为。这个示例结果一般都会输出 bb,而并非预期中的 ab 或 ba。原创 2024-02-23 21:37:00 · 986 阅读 · 0 评论 -
Go 1.22 对 net/http 包的路由增强功能详解
Go 1.22 版本对 net/http 包的路由功能进行了增强,引入了方法匹配(method matching)和通配符(wildcards)两项新功能,这些特性使得开发者能够使用模式字符串来表达常见的路由,而不需要直接编写 Go 代码。原创 2024-02-21 20:25:39 · 1228 阅读 · 1 评论 -
Golang 如何基于现有的 context 创建新的 context?
在 Golang 中,context 包提供了创建和管理上下文的功能。当需要基于现有的 context.Context 创建新的 context 时,通常是为了添加额外的控制信息或为了满足特定的生命周期需求。原创 2024-01-16 22:12:23 · 911 阅读 · 0 评论 -
深入浅出 Golang 中的参数传递机制
在值传递中,当函数被调用时,实参的值会被复制一份,并将这个副本传递给对应的形参,函数内部对形参的操作不会改变实参的原始值。安全,函数内对参数的修改不会影响原始数据。简单清晰好理解,函数可以随意操作参数而不会影响外部的值。创建副本可能导致额外的内存消耗,特别是当数据结构较大时。不能直接修改原始数据,需要通过返回值或者使用指针/引用。原创 2024-01-13 21:38:11 · 1394 阅读 · 1 评论 -
Golang 中的信号(Signal)机制详解
Signal 是一种操作系统级别的事件通知机制,进程可以响应特定的系统信号。这些信号用于指示进程执行特定的操作,如程序终止、挂起、恢复等。Golang 的标准库 os/signal 提供了对信号处理的支持,本文将详细讲解 Golang 是如何处理和响应系统信号的。原创 2024-01-11 21:53:55 · 1699 阅读 · 0 评论 -
Golang 中哪些类型可以作为 map 类型的 key?
在 Go 语言中,map 是一种内置的关联数据结构类型,由一组无序的键值对组成,每个键都是唯一的,并与一个对应的值相关联。本文将详细介绍哪些类型的变量可以作为 map 的键,并通过实例进行说明。原创 2024-01-10 21:56:10 · 999 阅读 · 0 评论 -
如何使用 Golang 比较版本号大小?
在日常开发中,比较版本号大小的情况是经常遇到的。因为版本号通常是字符串形式的,所以在 Go 语言中,比较版本号大小通常需要将字符格式的版本号串解析为可比较的数值,然后进行比较。版本号通常遵循语义化版本控制规范(Semantic Versioning),由主版本号、次版本号和修订号组成,格式为 Major.Minor.Patch,其中Major、Minor、Patch均为整数,例如 1.0.0。在比较版本号大小时,需要使用点分隔符(".")分割版本号字符串,然后将得到的各个部分转换为整数后进行比较。原创 2024-01-09 21:03:06 · 891 阅读 · 1 评论 -
深入解析 Golang 中的自旋锁
自旋锁是一种忙等待锁,当一个线程尝试获取一个已经被其它线程持有的锁时,这个线程会持续循环检查锁的状态(即“自旋”) ,直到锁被释放后获得所有权。这种等待方式避免了线程上下文切换带来的开销,因此比较适用于锁竞争不激烈且锁定时间非常短的场景。原创 2024-01-07 20:16:24 · 1298 阅读 · 1 评论 -
Golang 中可比较的数据类型详解
在日常开发中,比较操作是最常用的基本操作之一,可以用来判断变量之间是否相等或者对应的大小关系,比较操作对于排序、查找和集合数据结构的实现至关重要。在 Golang 中,不是所有的数据类型都是可比较的。理解哪些数据类型是可以进行比较的以及如何比较,对于编写健壮和高效的代码是非常重要的。本文将深入解析 Golang 中可比较的数据类型,并结合代码示例来说明如何在不同情况下进行比较。原创 2024-01-07 10:10:01 · 1312 阅读 · 0 评论 -
深入理解 Golang 中的值类型和引用类型
在 Golang 中,数据类型可以分为两大类:值类型(Value Types)和引用类型(Reference Types)。理解这两种类型的区别对于理解 Golang 中的数据传递和内存管理是很重要的。原创 2024-01-04 21:51:34 · 1648 阅读 · 2 评论 -
一文掌握 Golang 中的类型断言
Golang 中的接口是一种抽象类型,可以存储任何实现了该接口方法的类型实例。然而,由于接口本身不包含类型信息,需要通过类型断言来将接口变量转换为实际类型。原创 2024-01-03 21:26:41 · 1152 阅读 · 1 评论 -
如何理解函数是一等公民?
在编程语言设计中,一个实体如果支持所有通常对其他实体可用的操作,那么这个实体就被认为是“一等公民”(first-class functions),这些操作通常包括作为参数传递、从函数返回、修改并分配给变量等。很多编程语言实现了将函数作为一等公民,也就意味着在这些语言中,函数与其他值(如整数、字符串和结构体等)享有相同的地位,不仅可以被调用执行,还可以像其他普通变量一样被传递、赋值给其他变量、作为其他函数的参数和返回值,甚至可以存储在数据结构中。这种特性是函数式编程实现的基础。原创 2024-01-02 21:44:25 · 911 阅读 · 0 评论 -
你真的理解 Golang 中的内存泄漏吗?
内存泄漏是指程序在申请内存后,未能及时释放不再使用的内存空间,导致这部分内存无法被再次使用,随着时间的推移,程序占用的内存不断增长,最终导致系统资源耗尽或程序崩溃。原创 2023-12-27 21:50:49 · 944 阅读 · 0 评论 -
深入理解 golang 中的反射机制
反射机制在 Golang 中是通过 reflect 包来实现的,reflect 包提供了两个主要的类型:reflect.Type 和 reflect.Value。reflect.Type,在 Golang 中,每个值都有一个对应的类型。类型信息包含了类型的名称、结构体字段等信息。reflect.Type 可以代表 Golang 中的任意类型,无论是基本类型还是用户自定义的类型,甚至是接口类型。原创 2023-12-26 22:17:48 · 1170 阅读 · 1 评论 -
Golang 内存分配机制详解
Go 语言的内存分配机制是理解和优化 Go 程序性能的关键。在 Go 中,内存管理是自动进行的,这得益于 Go 的垃圾回收机制。了解内存如何分配和回收,可以帮助我们写出更高性能的代码。本文将深入讲解下 Go 内存分配机制。原创 2023-12-19 21:10:27 · 1491 阅读 · 1 评论 -
一文弄懂 Golang 中的内存逃逸
在Go语言中,内存分配有两种方式:栈分配和堆分配。栈分配是在函数调用时为局部变量分配内存,当函数返回时,这些内存会自动释放。而堆分配则是通过 new 或者 make 函数动态分配内存,需要手动进行释放。内存逃逸是指原本应该在栈上分配的内存被分配到了堆上。这意味着即使函数返回后,这部分内存也不会被自动释放,需要等待垃圾回收器来回收。原创 2023-12-17 21:29:59 · 1383 阅读 · 0 评论 -
如何正确理解和使用 Golang 中 nil ?
在 Golang 中,nil 是一个预定义的标识符,在不同的上下文环境中有不同的含义,但通常表示“无”、“空”或“零值”。nil 可以赋值给指针、切片、map、通道、函数以及接口类型的变量。理解 nil 的含义对于编写出健壮的 Go 程序至关重要,如果不能正确地处理 nil 可能会导致意外的问题。原创 2023-12-15 23:19:27 · 1543 阅读 · 1 评论 -
在 Golang 中如何实现 RSA 算法的加解密操作?
RSA 是一种非对称加密算法,广泛使用于数据的安全传输。crypto/rsa 是 Golang 中实现了 RSA 算法的一个标准库,提供了生成公私钥对、加解密数据、签名和验签等功能。接下来借助 crypto/rsa 的使用示例来看下对应的使用方法。原创 2023-12-14 21:52:34 · 1611 阅读 · 0 评论 -
Golang 模块版本管理与语义版本控制详解
在 Golang 中,模块(module)是 Go 1.11 版本引入的依赖管理系统,帮助开发者管理项目的依赖。在 Go 模块推出之前,开发者通常使用 GOPATH 和 vendor 目录来管理项目的依赖。但是,这种方法存在一些问题,如依赖管理不严格、版本控制不方便等。Go 模块的出现解决了这些问题,使得依赖管理变得更加简单和高效。Go 模块的版本管理是基于语义版本控制(Semantic Versioning,简称 SemVer)的。在深入讨论 Go 模块版本之前,需要先理解语义版本控制的基本概念。原创 2023-12-03 19:05:07 · 1133 阅读 · 0 评论 -
Go 模块系统最小版本选择法 MVS 详解
Golang 模块系统是 Go 1.11 版本引入的一个新特性,主要目的是解决 Go 项目中的依赖管理问题。在模块系统出现之前,Go 项目通常使用 GOPATH 和 vendor 目录来管理依赖关系,这种方式存在一些缺点,如重复下载依赖、版本冲突等。Golang 模块系统通过引入模块的概念,将依赖关系存储在一个全局的模块缓存中,从而避免了重复下载依赖的问题。同时,模块系统还提供了一种方法来管理包的版本,即最小版本选择法。原创 2023-12-02 10:36:13 · 656 阅读 · 1 评论 -
深入浅出 Golang 中的直接依赖和间接依赖管理
直接依赖是指项目代码中明确引用的其他包的依赖,而间接依赖是指直接依赖所引用的其他包的依赖。还是以 myproject 为例,假如还依赖了 github.com/stretchr/testify 包,如果查看这个包的源码,会发现依赖了其他一些包,这些被依赖的包就是 myproject 的间接依赖。在 Golang 中,直接依赖指的是项目本身明确引用的外部包或模块,这些包在项目代码中被直接 import。直接依赖是指项目代码中明确引用的其他包的依赖,而间接依赖是指直接依赖所引用的其他包的依赖。原创 2023-11-29 21:50:54 · 1581 阅读 · 0 评论 -
Go 工具链详解(七):模块缓存清理工具
在 Golang 中,模块是对一组版本化的包的集合的描述。Go 1.11 版本引入了模块支持,通过 go mod 命令提供了对模块的管理。Go 模块的一个重要特性是依赖管理,可以清晰地定义项目所依赖的模块及对应的版本,并确保代码使用正确的版本。运行 go mod tidy 或 go mod download 命令时,Go 会检查 go.mod 文件中的依赖项,并先从缓存中查找。如果找不到,就会通过网络下载该模块并存储在缓存中(默认存储在 $GOPATH/pkg/mod 目录下面)。原创 2023-11-22 21:40:40 · 2069 阅读 · 0 评论 -
安全高效又易用的密码哈希神器-bcrypt 算法解析
所以采用强密码和有效的密码管理策略变得越来越重要,因此 bcrypt 应运而生,它是一种安全且灵活的密码哈希算法,能够抵御各种攻击,保障用户的数据安全。缺陷是每次哈希的结果都是一样的,相同的密码总是生成相同的哈希值,使得攻击者可以使用彩虹表(预先计算的哈希值列表)来反向查找密码。对密码进行哈希时,bcrypt 首先生成一个随机的盐(salt),盐是一个足够长的随机数,通常是128位(16字节),盐的作用是确保对同一个密码每次哈希的结果都不同。这是最不安全的存储方法,项目中是绝不能使用的。原创 2023-11-14 21:48:58 · 214 阅读 · 0 评论 -
HMAC 详解:在 Golang 中实现消息认证码
HMAC(Hash-based Message Authentication Code)是一种基于 Hash 函数和密钥的消息认证码,由 H.Krawezyk,M.Bellare,R.Canetti 于1996年提出的一种基于 Hash 函数和密钥进行消息认证的方法,并于1997年作为 RFC2104 被公布。HMAC 将密钥、消息和哈希函数一起使用,确保消息在传输过程中不被篡改,还可以验证消息的发送者身份。原创 2023-11-10 21:25:38 · 639 阅读 · 0 评论 -
带你一步步使用 Golang 实现 SSH 客户端
SSH 全称为 Secure Shell,是一种用于安全地远程登录到网络上的其他计算机的网络协议。相信做后端开发的同学没有不了解 SSH的,比较常用的登录服务器的 shell 工具例如 Xshell、SecureCRT、iTerm2 等都是基于 SSH 协议实现的。Golang 中的的 crypto/ssh 包提供了实现 SSH 客户端的功能,本文接下来详细讲解下如何使用 Golang 实现 SSH 客户端。原创 2023-11-08 22:13:39 · 884 阅读 · 0 评论 -
使用 Golang 实现基于时间的一次性密码 TOTP
上篇文章详细讲解了一次性密码 OTP 相关的知识,基于时间的一次性密码 TOTP 是 OTP 的一种实现方式。这种方法的优点是不依赖网络,因此即使在没有网络的情况下,用户也可以生成密码。所以这种方式被许多流行的网站使用到双因子或多因子认证中,包括 Google、GitHub、Facebook 和 Salesforce 等等。原创 2023-11-06 21:51:39 · 571 阅读 · 0 评论 -
保障 Golang 项目安全的最佳实践
对任何项目来说,安全都是一个永恒的话题,本文详细讲解一下保障 Golang 项目的安全性需要遵循一些最佳实践。原创 2023-10-29 10:22:04 · 407 阅读 · 0 评论 -
Go 工具链详解(六):依赖管理神器
go mod 是 Golang 的官方依赖管理工具,从 Go 1.11 版本开始引入。go mod 使用一种被称为模块(modules)的方式来管理依赖,每个模块都包含了一组 Golang 包。一个 Go 程序可以由多个模块组成,每个模块都可以有自己的 go.mod 文件来描述其依赖。接下来逐个讲解一下 go mod 中的命令。原创 2023-10-25 22:37:14 · 462 阅读 · 0 评论 -
Golang 结构化日志包 log/slog 详解(六):slog.Record
上一篇文章讲解了 log/slog 包中的 LogValuer 和日志记录函数的正确包装方法,本文详细讲解一下 slog.Record 结构体的使用方法和需要注意的点。原创 2023-10-17 21:37:41 · 480 阅读 · 0 评论 -
Golang 结构化日志包 log/slog 详解(五):LogValuer 和函数包装
上一篇文章讲解了 log/slog 包中的分组、上下文和属性值类型,本文讲解下 LogValuer 和日志记录函数的正确包装方法。原创 2023-10-15 15:38:53 · 578 阅读 · 0 评论 -
Golang 程序漏洞检测利器 govulncheck(三):github 集成方法
上一篇文章详细介绍了 Golang 程序漏洞扫描工具 govulncheck 使用的漏洞数据库(Go vulnerability database),本文详细讲解下 Github 项目如何使用 govulncheck。govulncheck 为 Golang 开发者提供了一种准确可靠的方式来了解程序中可能存在的漏洞。官方也开发了对应的 GitHub Action 来帮助开发者扫描托管在 Github 上的项目。原创 2023-10-08 21:07:35 · 517 阅读 · 0 评论 -
Golang 结构化日志包 log/slog 详解(四):分组、上下文和属性值类型
上一篇文章讲解了 log/slog 包中的自定义日志属性字段和日志级别,本文讲解下分组、上下文和属性值类型。原创 2023-09-24 20:24:14 · 523 阅读 · 0 评论 -
Golang 中空的切片转化成 JSON 后变为 null 的问题如何解决?
在 Golang 中,经常需要将其他类型(例如 slice、map、struct 等类型)的数据转化为 JSON 格式。有时候转化的结果并不是预期中的,例如将一个空的切片转化为 JSON 时,会变成"null",而并非预期的"[]"。结果输出的值为 “null”,而并非预期中的 “[]”。原创 2023-09-22 22:05:48 · 877 阅读 · 0 评论 -
Golang net/http 包中的 RoundTripper 接口详解
RoundTripper 是 net/http 包中的一个接口,定义了处理 HTTP 请求返回和响应的方法,是 http.Client 结构体中执行 http 请求的核心部分。只定义了 RoundTrip 一个方法,用于执行单个 HTTP 事务,发送请求数据并返回对应的响应数据。RoundTrip 不应该去解析响应数据,特别是如果获得了响应数据后,RoundTrip 必须返回值为 nil 的 error(不管响应的HTTP状态码是什么)。原创 2023-09-21 21:29:59 · 586 阅读 · 0 评论 -
Golang 中 int 类型和字符串类型如何相互转换?
在日常开发中,经常需要将数字转换为字符串或者将字符串转换为数字。在 Golang 中,有一些很简便的方法可以实现这个功能,接下来就详细讲解一下如何实现 int 类型和字符串类型之间的互相转换。原创 2023-09-19 21:37:42 · 1013 阅读 · 1 评论 -
Go 工具链详解(五):竞态条件检测神器 Race Detector
并发编程可以提高程序的性能和稳定性,但也带来了一些挑战,如竞态条件。竞态条件是指并发程序中的多个线程同时访问共享资源,导致程序行为不确定的问题。为了避免竞态条件的产生,需要使用同步机制(如互斥锁、条件变量等)来协调线程之间的访问。然而,在复杂的程序中,竞态条件可能难以察觉,因此 Golang 提供了竞态条件检测工具 Race Detector。原创 2023-09-14 22:20:31 · 390 阅读 · 0 评论 -
Golang 中的匿名变量详解
在 Golang 中,匿名变量是一种没有显式声明名称的变量,通常用于在需要临时存储值但不需要在后续代码中使用该值的情况。匿名变量的声明方式是使用下划线“_”作为变量名。其中,functionName 是要调用的函数名,arg1, arg2, ... 是传递给该函数的参数列表。在这个语法结构中,使用下划线作为变量名,表示不关心该函数的返回值。通过这种方式可以将函数调用的结果直接丢弃,从而达到忽略的目的。// 声明一个匿名变量并初始化为10_ = 10// 声明一个匿名变量并将一个函数的返回值赋值给它。原创 2023-09-13 22:34:01 · 547 阅读 · 0 评论 -
Golang 结构化日志包 log/slog 详解(三):属性字段和日志级别
上一篇文章讲解了 log/slog 包中的 Handler 的使用方法,通过不同的 Handler 可以输出不同格式的日志。接下来看一下如何自定义日志的属性字段和日志级别。原创 2023-09-12 21:55:12 · 1111 阅读 · 0 评论 -
Golang 结构化日志包 log/slog 详解(二):Handler
默认情况下,输出的日志格式是普通的 text 格式,这种格式并不是最适合日志系统的格式。日志系统一般采用 SON 格式或者 key=value 类型的文本格式,log/slog 包也提供了对应功能。原创 2023-09-09 21:32:15 · 647 阅读 · 0 评论