
Golang
文章平均质量分 87
Go 语法与原理介绍
恋喵大鲤鱼
一条不止于编码的鱼。
展开
-
Golang 字符串字面量表示方法
在 Go 语言中,字符串字面量可以通过不同的方式来表示。原创 2024-12-04 14:10:56 · 991 阅读 · 0 评论 -
gomonkey 快速上手
gomonkey是一个使单元测试中 Monkey Patching 变得简单的库,Monkey Patching 的核心思想来自Bouke,你可以阅读来了解其工作原理。原创 2024-11-10 18:25:59 · 1126 阅读 · 0 评论 -
Golang 字面量的表示
在 Go 语言中,字面量是用来表示固定值的表达式。Go 支持几种类型的字面量,包括整型、浮点型、字符串、字符、布尔值以及复合类型(如数组、切片、结构体、映射等)。下面我将介绍一些在 Go 语言中使用字面量的常见技巧和最佳实践。原创 2024-08-30 16:06:12 · 1083 阅读 · 3 评论 -
Gopher 必知的时间知识
时间包括时间值和时区,没有包含时区信息的时间是不完整、有歧义的。在与外部系统传递或解析时间时,应尽量采用无时区歧义的标准格式,如 HTTP 协议的时间格式或 Unix 时间戳。避免使用不包含时区信息的非标准时间格式(如 yyyy-mm-dd HH:MM:SS),因为这类格式在解析时可能会依赖默认的环境设置(如系统时区或数据库时区),从而引发潜在的问题。原创 2024-08-25 21:21:44 · 1184 阅读 · 0 评论 -
Golang 避坑指南
本文将介绍 Golang 初学者容易菜的坑,希望广告 Gopher 避而远之。原创 2024-06-10 18:05:27 · 1658 阅读 · 9 评论 -
Golang GC 介绍
GC 全称 Garbage Collection,目前主流的垃圾回收算法有两类,分别是追踪式垃圾回收算法(Tracing garbage collection)和引用计数法( Reference counting )。Golang 使用的三色标记法属于追踪式垃圾回收算法的一种。追踪式算法的核心思想是判断一个对象是否可达,因为一旦这个对象不可达就可以立刻被 GC 回收了。原创 2024-02-06 15:28:38 · 1845 阅读 · 3 评论 -
Golang 泛型实现原理
泛型(Generics)是 Go 语言在较早版本缺失的一个特性,直到 Go 1.18 版本中才引入了泛型。泛型提供了一种更灵活、更通用的方式来编写函数和数据结构,以处理不同类型的数据,而不必针对每种类型编写重复的代码。原创 2023-12-23 19:39:51 · 2689 阅读 · 3 评论 -
Golang make vs new
在 Go 语言中,make 和 new 是两个用于创建对象的内建函数,它们有不同的用途和适用范围。make是 Go 的内置函数,「只用于」创建(分配内存并初始化) slice、map 和 chan 类型的对象,并返回对象本身。// 创建一个初始长度为 5 容量也为 5 的切片// 创建一个初始长度为 0 容量也为 5 的切片// 创建一个映射// 创建一个映射,并给定一个容量提示// 创建无缓冲信道// 创建容量为 10 的有缓冲信道new。原创 2023-12-23 15:18:12 · 1189 阅读 · 0 评论 -
Golang 的内存管理
页堆是内存分配的核心结构体,Go 语言程序会将其作为全局变量存储,而堆上初始化的所有对象都由该结构体统一管理,该结构体中包含两组非常重要的字段,其中一个是全局的中心缓存列表 central,另一个是管理堆区内存区域的 arenas 以及相关字段。微分配器只会用于分配非指针类型的内存,上述三个字段中 tiny 会指向堆中的一片内存,tinyoffset 是下一个空闲内存所在的偏移量,最后的 tinyAllocs 会记录内存分配器中分配的对象个数。Go 的内存分配器会根据申请分配的内存大小选择不同的处理逻辑。原创 2023-12-21 20:14:16 · 1992 阅读 · 3 评论 -
Go 1.20 发行说明(翻译)
最新的 Go 版本 1.20 在 Go 1.19 发布六个月后发布。它的大部分变化在于工具链、运行时和库的实现。与往常一样,该版本保持了 Go 1 的兼容性承诺。我们期望几乎所有 Go 程序都能像以前一样继续编译和运行。翻译 2023-06-30 20:53:59 · 1964 阅读 · 2 评论 -
Golang 接口相等比较注意要点
这是属于你的世界,来看一看如何让这里更加精彩吧:#欢迎大厅:欢迎来到欢迎大厅频道#游戏动态:欢迎来到游戏动态频道#闲聊灌水:欢迎来到闲聊灌水频道#攻略分享:欢迎来到攻略分享频道#玩法互助:欢迎来到玩法互助频道这是属于你的世界,来看一看如何让这里更加精彩吧:...原创 2021-04-13 12:18:34 · 1366 阅读 · 4 评论 -
Go 神坑 1 —— interface{} 与 nil 的比较
文章目录1.前言2.出乎意料的比较结果3.寻找问题所在4.避坑大法5.小结参考文献1.前言interface 是 Go 里所提供的非常重要的特性。一个 interface 里可以定义一个或者多个函数,例如系统自带的io.ReadWriter的定义如下所示:type ReadWriter interface { Read(b []byte) (n int, err error) Write(b []byte) (n int, err error)}任何类型只要它提供了 Read .原创 2021-10-19 16:38:29 · 2033 阅读 · 0 评论 -
Golang 防止路径遍历漏洞
路径遍历漏洞,也被称为目录遍历漏洞,是一种常见的安全漏洞类型,攻击者可以通过该漏洞访问或修改应用程序之外的目录或文件。这种漏洞通常由于应用程序在接受用户输入时没有正确过滤或验证用户提供的文件路径导致。攻击者可以通过构造特定的输入,使得应用程序执行意外的操作,例如读取敏感文件、修改应用程序之外的文件或删除文件等。如果不对用于输入的路径进行过滤,那么上面的请求路径将被路由到其他桶,导致重要数据泄露。原创 2023-03-15 15:37:02 · 1580 阅读 · 0 评论 -
Golang channel 用法与实现原理
Golang channel 是一种并发原语,用于在不同 goroutine 之间进行通信和同步。本质上,channel 是一种类型安全的 FIFO 队列,它可以实现多个 goroutine 之间的同步和通信。channel 是一种引用类型,即使是在不同的 goroutine 之间传递channel时,它们仍然指向相同的底层数据结构。原创 2023-02-22 20:56:35 · 1552 阅读 · 0 评论 -
Golang select 用法与实现原理
Golang 中的 select 语句是用于多路复用的一种语言结构,用于同时等待多个通道上的数据,并执行相应的代码块。也就是说 select 是用来监听和 channel 有关的 IO 操作,它与 select,poll,epoll 相似,当 IO 操作发生时,触发相应的动作,实现 IO 多路复用。case 必须是一个通信操作。select 语句中除 default 外,各 case 执行顺序是随机的。select 语句中如果没有 default 语句,则会阻塞等待任意一个 case。原创 2023-02-22 15:36:41 · 2412 阅读 · 0 评论 -
Golang 何时使用泛型
Go泛型的设计者 Ian Lance Taylor 在官方博客发表了一篇文章,详细说明了在什么场景下应该使用泛型,什么场景下不要使用泛型。这对于我们编写 Go 泛型代码非常有指导意义。本人在原文的基础上做了一些表述上的优化和内容扩充,帮助大家理解。这篇博客汇总了我在2021年Google开源活动日和GopherCon会议上关于泛型的分享。Go 1.18版本新增了一个重大功能:支持泛型编程。原创 2023-01-06 11:21:08 · 330 阅读 · 2 评论 -
一文读懂 Golang init 函数执行顺序
Golang init 函数是一种特殊的函数,主要用于完成程序的初始化工作,如初始化数据库的连接、载入本地配置文件、根据命令行参数初始化全局变量等。init ainit binit cmaininit 函数是可选的,可以没有;与 main 函数一样,不能有入参与返回值;与 main 函数一样,init 会自动执行,不能被其他函数调用;一个包内可以有多个 init 函数,即可以在包的多个源文件中定义多个 init 函数。原创 2022-10-14 21:14:08 · 6099 阅读 · 0 评论 -
Go 1.19 发行说明(翻译)
最新的 Go 版本 1.19 比 Go 1.18 晚了五个月。它的大部分更改都在工具链、运行时和库中。与往常一样,该版本保持了 Go 1 的兼容性承诺。我们希望几乎所有 Go 程序都能像以前一样继续编译和运行。原创 2022-09-25 21:36:20 · 1885 阅读 · 0 评论 -
Golang 并发模式
Go 为并发而生。在使用 Go 编写并发程序时,我们应该熟悉常见的并发模式。虽然业务开发中常用的可能只有那么一两种,但还是有必要了解一下,因为面试可能会被问到。Go 并发模式指的是对并发协程的管理方式,根据不同的业务场景要求,大概可分为如下几种。原创 2022-09-15 22:08:00 · 790 阅读 · 0 评论 -
Go 1.18 发行说明(翻译)
美国时间 2022 年 3 月 15 日,Go 团队官宣 Go 1.18 正式发布。下面让我们一起了解下 Go 1.18 为我们带来的新特性吧。本文主要翻译自。翻译 2022-09-13 13:02:43 · 604 阅读 · 0 评论 -
深入理解 Go Modules 的 go.mod 与 go.sum
流行的现代编程语言一般都提供依赖库管理工具,如 Java 的 Maven 、Python 的 PIP、Node.js 的 NPM 和 Rust 的 Cargo 等。Go 最为一门新生代语言,自然也有其自己的库管理方式。在 Go 1.5 之前,Go 最原始的依赖管理使用的是 go get,执行命令后会拉取代码放入 GOPATH/src 下面。但是它是作为 GOPATH 下全局的依赖,并且 go get 还不能进行版本控制,以及隔离项目的包依赖。而随着 Go 生态圈的快速壮大,无法进行版本控制,会导致项目中的依原创 2022-06-07 11:47:31 · 6661 阅读 · 0 评论 -
Golang 删除切片指定元素的几种方法
文章目录1.截取法(修改原切片)2.拷贝法(不改原切片)3.移位法(修改原切片)3.1 方式一3.2 方式二4.性能对比5.小结参考文献Go 并没有提供删除切片元素专用的语法或函数,需要使用切片本身的特性来删除元素。删除切片指定元素一般有如下几种方法,本文以 []int 为例给出具体实现。假设我们的切片有 0 和 1,我们要删除所有的 0。1.截取法(修改原切片)这里利用对 slice 的截取删除指定元素。注意删除时,后面的元素会前移,下标 i 应该后移一位。// DeleteSlice1 删除原创 2022-05-07 13:03:56 · 21678 阅读 · 0 评论 -
Go Context 详解之终极无惑
Go 1.7 标准库引入 Context,中文名为上下文,是一个跨 API 和进程用来传递截止日期、取消信号和请求范围的值的接口。Deadline()返回一个完成工作的截止时间,表示上下文应该被取消的时间。如果 ok==false 表示没有设置截止时间。Done()返回一个 Channel,这个 Channel 会在当前工作完成时被关闭,表示上下文应该被取消。如果无法取消此上下文,则 Done 可能返回 nil。多次调用 Done 方法会返回同一个 Channel。Err()原创 2022-02-03 21:08:37 · 7553 阅读 · 2 评论 -
Golang defer 快速上手
文章目录1.简介2.注意事项2.1 defer 函数的入参在 defer 时确定2.2 多个 defer 函数的执行顺序为后进先出2.3 defer 函数在 return 语句赋值与返回之间执行2.4 defer 遇上闭包3.使用场景3.1 释放资源3.2 跟踪函数执行3.3 捕获 panic4.小结参考文献1.简介defer 用于预设一个函数调用,推迟函数的执行。被推迟的函数会在执行 defer 的函数返回之前执行。package mainimport "fmt"func main() {原创 2022-01-08 22:58:02 · 791 阅读 · 0 评论 -
Golang math/rand 源码剖析&避坑指南
文章目录1.前言2.剖析3.核心函数4.需要避开的坑参考文献1.前言Go 版本为 go 1.17。go version go1.17 darwin/amd64本文以type rand struct 为切入点,看下 Go 伪随机数的实现原理。// A Rand is a source of random numbers.type Rand struct { src Source s64 Source64 // non-nil if src is source64 // readVal .原创 2021-09-10 20:36:24 · 1449 阅读 · 0 评论 -
记录使用 Golang math/rand 随机数遇到的坑
1.背景有一个业务需求,需要将用户 ID(数值型 >=10000000)映射为一个唯一且不重复的长 6 个字符的邀请码,用于邀请新用户注册。可以不用通过邀请码反推对应的用户 ID 是什么。2.我的思路首先确定生成邀请码的字符空间,使用数字和英文大小写字母共计 62 个字符。如果长度时 6 的邀请码,那么空间大小 62^6 = 56,800,235,584,这是一个非常大的空间,足够用户量为亿级别的业务使用。// AlphanumericSet 字母数字集var AlphanumericSe原创 2021-09-06 11:54:44 · 1309 阅读 · 0 评论 -
Golang 单元测试快速上手
单元测试(Unit Testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般要根据实际情况去判定其具体含义,如 C 语言中单元指一个函数,Java 里单元指一个类,图形化软件可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小被测功能模块。在 Go 中,单元测试一般指对函数或方法的测试。go test 是 Go 用来执行测试函数(test function)、基准函数(benchmark function)和示例函数(example function)的命令。原创 2021-07-20 18:57:54 · 818 阅读 · 10 评论 -
Go 统计含 emoji 字符串字符数
1.背景项目种需要统计用户昵称的字符数量进行限制,用户可以输入英文,中文,emoji 字符,当用户输入中英文和普通的 emoji 字符时,将字符串转为 []rune 进行统计没有问题。func main() { s0 := "我爱中国" // 中文 s1 := "我爱China" // 中英文 s2 := "我爱China????" // 中英文加普通 emoji(笑脸) fmt.Println(len([]rune(原创 2021-07-15 19:51:32 · 1689 阅读 · 1 评论 -
Golang sort 排序
1.前言开发过程中,我们经常需要对元素进行排序,使用 Go 我们可以轻松实现。Go 内置 sort 包中提供了根据一些排序函数可对任何序列进行排序,并提供自定义排序规则的能力。sort 包实现了四种基本排序算法:插入排序(Shell 排序)、归并排序、堆排序和快速排序。 但是这四种排序方法是不公开的,它们只被用于 sort 包内部使用,sort 包会根据实际数据自动选择高效的排序算法。Go sort 包主要提供了三种排序能力:(1)基本类型切片排序;(2)自定义比较器;(3)排序任意数据结构。原创 2021-06-28 23:08:30 · 8201 阅读 · 5 评论 -
Go 继承
面向对象编程的三大特性:封装、继承、多态。可见继承是面向对象程序设计中一个重要的概念。Go 作为面向对象的编程语言,自然也支持继承。比较特殊的是 Go 实现继承的方式与其他传统 OOP 语言所有不同,不像 C++ 有专门的继承语法,或者像 Java 中有专门的关键字 extends。// 基类 class Animal {public :};// 子类 class Dog : public Animal {public :};// 基类 public class Animal {};原创 2021-06-15 00:39:03 · 6175 阅读 · 0 评论 -
白话 Golang pprof
有时,我们开发的 Golang 程序会出现 CPU 使用率达到 100%,内存使用量过大,死锁等问题,我们该如何定位上诉问题的具体位置,来解决程序的到性能问题呢?Go 是一个非常注重性能的语言,语言内置了里性能分析库 runtime/pprof、net/http/pprof 和配套的分析工具 go tool pprof。所以我们平时说的 golang pprof 实际上包含两部分:(1)编译到程序中的 runtime/pprof 和 net/http/pprof 包;(2)性能分析工具 go tool原创 2021-06-04 16:55:50 · 2607 阅读 · 2 评论 -
白话 Golang 协程池
如果此时 P 的队列为空,即没有其他 G 可以执行, M 会先尝试从全局队列寻找 G 来执行,如果全局队列为空,它会随机挑选另外一个 P,从它的队列里拿走一半 G 到自己的队列中执行。P 的数量在默认情况下,会被设定为 CPU 的核数。Go 程的调度模型是 G-P-M,通过 P(Processor,逻辑处理器)将 G(Goroutine,用户线程)与 M(Machine,系统线程)解耦,我们可以随意开启多个 G 交由调度器分配到 P,再通过 P 将 G 交由 M 来完成执行。(1)Go 程数量固定。原创 2021-05-14 17:26:51 · 8210 阅读 · 3 评论 -
Golang 并发赋值的安全性探讨
我们知道 Golang 中变量的赋值不是并发安全的。1.什么是并发安全并发安全就是程序在并发情况下执行的结果是正确的。比如对一个变量简单的自增操作count++,在非并发下很好理解,而在并发情况下却容易出现预期之外的结果,这样的代码就是非并发安全的。因为count++其实是分成两步执行的,当分成了两步执行,那么其他协程就可以趁着这个时间间隙作怪。如一下 ab 两个协程同时 count++:count:= 1a > 读取count : 1b > 读取count : 1a >原创 2021-04-04 22:53:18 · 8011 阅读 · 17 评论 -
Golang 环境变量须知
1.前言无论你是使用 Windows、Linux 还是 Mac 操作系统来开发 Go 应用程序,在安装好 Go 安装语言开发工具之后,都必须配置好 Go 语言开发所要求的 环境变量,才算初步完成 Go 开发环境的搭建。但对于一些初学者来说,可能不太明白 Go 语言中常用的环境变量的作用以及如何设置环境变量,下面在 Windows 环境下来讲讲。2.查看环境变量安装完 Go 后,我们可以使用 go env 命令查看当前 Go 的所有默认环境变量。go envset GO111MODULE=set原创 2021-03-22 17:44:31 · 2854 阅读 · 0 评论 -
Golang map 三板斧第二式:注意事项
文章目录1.map 默认初始值为 nil2.map range 顺序的随机性3.map 值传递表现出引用传递的效果4.map 元素不可取址5.map 并发读写问题参考文献map 使用起来非常方便,但也有些必须要注意的地方,否则可能会导致程序异常甚至 panic。1.map 默认初始值为 nilmap 未初始化的情况下值为 nil,此时进行取值,返回的是对应类型的零值,不会引发 panic。所以取值时如果不关心取的是否是零值,那么可以直接取而不用使用 comma-ok 式,这样会使代码变得简洁许多。.原创 2020-11-08 15:30:09 · 691 阅读 · 0 评论 -
Golang map 三板斧第三式:实现原理
Go map 底层实现方式是 Hash 表(C++ map 基于红黑树实现,而 C++ 11 新增的 unordered_map 则与 Go map 类似,都是基于 Hash 表实现)。Go map 的数据被置入一个由桶组成的有序数组中,每个桶最多可以存放 8 个键值对。key 的 Hash 值低位用于在该数组中定位到桶,而高 8 位则用于在桶中区分 key/value 对。Go map 的 hash 表中的基本单位是桶,每个桶最多存 8 个键值对,超了则会链接到额外的溢出桶。原创 2020-11-08 15:18:32 · 805 阅读 · 1 评论 -
Part 5 —— 保持 Go 模块兼容
翻译自 Go 官方博文。这篇文章是系列文章的第五部分。Part 1 —Part 2 —Part 3 —Part 4 —Part 5 —当您添加新功能、更改行为和重新考虑模块公共表面的部分时,您的模块将随着时间的推移而进化。正如中所讨论的,对 v1+ 模块的中断性更改必须作为主要版本的一部分(或者采用一个新的模块路径)。然而,发布一个新的主要版本对您的用户来说是很困难的。他们必须找到新版本,学习新 API,并修改代码。有些用户可能永远不会更新,这意味着您必须永远维护代码的两个版本。翻译 2020-09-13 21:51:30 · 597 阅读 · 1 评论 -
Part 4 —— Go 模块:v2 及更高版本
文章目录简介(Introduction)主要版本和模块路径(Major versions and module paths)主要版本策略(Major version strategies)发布 v2 及更高版本(Publishing v2 and beyond)结论(Conclusion)相关阅读(Related articles)简介(Introduction)翻译自 Go 官方博文 Go Modules: v2 and Beyond。Jean de Klerk and Tyler Bui-Pal翻译 2020-09-13 18:24:27 · 1545 阅读 · 1 评论 -
Part 3 —— 发布 Go 模块
翻译自 Go 官方博文。这篇文章是系列文章的第三部分。Part 1 —Part 2 —Part 3 —Part 4 —Part 5 —这篇文章讨论了如何编写和发布模块,以便其他模块可以依赖它们。请注意:这篇文章涵盖了 v1 及其之前的开发,如果您对 v2 感兴趣,请参阅。这篇文章在例子中使用了Git,但MercurialBazaar等也得到了支持。翻译 2020-09-13 12:08:06 · 477 阅读 · 1 评论 -
Part 2 —— 迁移到 Go 模块
Jean de Klerk21 August 2019简介这篇文章是系列文章的第二部分。Part 1 — Using Go ModulesPart 2 — Migrating To Go Modules (this post)Part 3 — Publishing Go ModulesPart 4 — Go Modules: v2 and BeyondPart 5 — Keeping Your Modules Compatible......翻译 2020-09-06 16:36:52 · 753 阅读 · 0 评论