Golang
文章平均质量分 89
golang技术学习
试剑江湖。
做你没做过的事叫成长,做你不愿意做的事叫改变,做你不敢做的事叫突破。
展开
-
Go 相关问题及解决办法汇总
go编码时难免踩坑原创 2022-01-16 01:30:45 · 1015 阅读 · 0 评论 -
Go 代码生成利器 Go Generate
在Go语言中,go generate 命令是一个非常有用的工具,它可以帮助我们自动化地生成代码。本文将详细介绍如何使用 go generate 命令,并提供一些示例来说明它的用法。go generate 命令是一个用于自动化生成Go代码的工具。它可以在Go源文件中的特殊注释中指定命令,然后在运行 go generate 命令时自动执行这些命令。这些命令可以用来生成代码、格式化代码、运行测试等等。原创 2023-08-08 22:24:59 · 2229 阅读 · 0 评论 -
Go GC之三色标记算法
为了解决原始标记清除算法带来的长时间 STW,多数现代的追踪式垃圾收集器都会实现三色标记算法的变种以缩短 STW 的时间。主流的垃圾收集器基本上都是基于可达性分析算法来判定对象是否存活的。根据对象是否被垃圾收集器扫描过而用白、灰、黑三种颜色来标记对象的状态的一种方法。而其中白色对象—表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始阶段,所有的对象都是白色的,若在分析结束之后对象仍然为白色,则表示这些对象为不可达对象,对这些对象进行回收。黑色对象。原创 2023-05-21 21:19:22 · 1671 阅读 · 1 评论 -
Go 并发之channel(通道)
通道类型的值本身就是并发安全的,这也是 Go 语言自带的、唯一一个可以满足并发安全性的类型。它使用起来十分简单。在声明并初始化一个通道的时候,需要用到 Go 语言的内建函数make。就像用make初始化切片那样,传给这个函数的第一个参数是代表了通道的具体类型的类型字面量。在声明一个通道类型变量的时候,首先要确定该通道类型的元素类型,这决定了可以通过这个通道传递什么类型的数据。比如,类型字面量chan int,其中的chan是表示通道类型的关键字,而int则说明了该通道类型的元素类型。原创 2023-05-20 22:48:47 · 3804 阅读 · 5 评论 -
Go 版本及新特性(持续更新中ing)
Go 新版本新特性都有哪些?原创 2023-04-05 22:43:20 · 1504 阅读 · 0 评论 -
Go panic的学习
defer语句将函数调用保存到一个列表上。保存的调用列表在当前函数返回前执行。Defer通常用于简化执行各种清理操作的函数。通俗地说,就是defer保证函数调用不管在什么情况下(即使当前函数发生panic),在当前函数返回前必然执行。另外defer的函数调用符合先进后出的规则,即先defer的函数后执行。原创 2023-03-16 22:43:52 · 2470 阅读 · 1 评论 -
Go 内存分配的学习
程序中的数据和变量都会被分配到程序所在的虚拟内存中,内存空间包含两个重要区域:栈区(Stack)和堆区(Heap)。函数调用的参数、返回值以及局部变量大都会被分配到栈上,这部分内存会由编译器进行管理;不同编程语言使用不同的方法管理堆区的内存,C++ 等编程语言会由工程师主动申请和释放内存,Go 以及 Java 等编程语言会由工程师和编译器共同管理,堆中的对象由内存分配器分配并由垃圾收集器回收。转载 2023-01-02 13:41:51 · 1030 阅读 · 0 评论 -
Go 性能优化之race实战
race 和 单例没有关系,也检测不出来。race 只是解决读写不一致的现场,出现同时读写的现象。原创 2022-12-22 14:22:34 · 1712 阅读 · 0 评论 -
Go 性能优化之pprof 实战
pprof 是在做性能优化前的性能分析工具。用它可以访问并分析性能数据文件,它还会根据我们的要求,提供高可读性的输出信息。Go 在语言层面上集成了 profile 采样工具,只需在代码中简单地引入runtime/pprof或者net/http/pprof包,即可获取程序的 profile 文件,并通过 profile 文件来进行性能分析。net/http/pprof基于runtime/pprof包进行封装,并在 HTTP 端口上暴露出来。原创 2022-12-22 10:46:58 · 4192 阅读 · 2 评论 -
Go sync.Pool池化的学习
Go 语言标准库也大量使用了 sync.Pool,例如 fmt 和 encoding/json。复用之前的内容,不用每次新建提前准备好,不用临时创建采用性能高的存储做缓存,更加提高响应速度 其实看下来跟我们的对象池,没什么区别,我们对象池也就是复用之前创建好的对象。最后发散下思想,影响我们的程序性能的有以下几个,存储、计算、网络等,其实都可以做缓存,或者提前准备好,亦或者复用之前的结果。原创 2022-12-18 22:19:45 · 1201 阅读 · 0 评论 -
Go 协程(goroutine)调度原理
Goroutine调度是一个很复杂的机制,尽管Go源码中提供了大量的注释,但对其原理没有一个好的理解的情况下去读源码收获不会很大。下面尝试用简单的语言描述一下Goroutine调度机制,在此基础上再去研读源码效果可能更好一些。原创 2022-12-12 23:20:35 · 3164 阅读 · 1 评论 -
Go context.Context的学习
Context仅仅是一个接口定义,根据实现的不同,可以衍生出不同的context类型;cancelCtx实现了Context接口,通过WithCancel()创建cancelCtx实例;timerCtx实现了Context接口,通过WithDeadline()和WithTimeout()创建timerCtx实例;valueCtx实现了Context接口,通过WithValue()创建valueCtx实例;三种context实例可互为父节点,从而可以组合成不同的应用形式;原创 2022-12-11 16:06:27 · 1366 阅读 · 0 评论 -
Go sync.WaitGroup的学习
sync代码包的WaitGroup类型和Once类型都是非常易用的同步工具。它们都是开箱即用和并发安全的。利用WaitGroup值,我们可以很方便地实现一对多的 goroutine 协作流程,即:一个分发子任务的 goroutine,和多个执行子任务的 goroutine,共同来完成一个较大的任务。在使用WaitGroup值的时候,我们一定要注意,千万不要让其中的计数器的值小于0,否则就会引发 panic。另外,原创 2022-11-27 13:32:50 · 1110 阅读 · 0 评论 -
Go 开发环境安装之Goland和vscode
Go语言或将成为新的主力开发语言,Go是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,所以我们有必要学习并掌握它。第一件事情,就是把环境搭建起来,大家可以跟着步骤一起将Go语言开发环境搭建起来。原创 2022-11-26 15:00:11 · 1999 阅读 · 0 评论 -
Go 终端命令手册
go mod edit :编辑go.mod文件,接 -fmt 参数格式化 go.mod 文件,接 -require=golang.org/x/text 添加依赖,接 -droprequire=golang.org/x/text 删除依赖,详情可参考 go help mod edit。go mod init:初始化go mod, 生成go.mod文件,后可接参数指定 module 名,上面已经演示过。go fix会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。原创 2022-11-26 13:59:13 · 1274 阅读 · 0 评论 -
Go sync.atomic原子操作的学习
我们把这两篇文章一起总结一下。相对于原子操作函数,原子值类型的优势很明显,但它的使用规则也更多一些。首先,在首次真正使用后,原子值就不应该再被复制了。其次,原子值的Store方法对其参数值(也就是被存储值)有两个强制的约束。一个约束是,参数值不能为nil。另一个约束是,参数值的类型不能与首个被存储值的类型不同。也就是说,一旦一个原子值存储了某个类型的值,那它以后就只能存储这个类型的值了。原创 2022-11-13 23:04:06 · 1300 阅读 · 0 评论 -
Go sync.Cond条件变量的学习
sync.Cond 条件变量用来协调想要访问共享资源的那些 goroutine,当共享资源的状态发生变化的时候,它可以用来通知被互斥锁阻塞的 goroutine。原创 2022-11-09 23:37:27 · 793 阅读 · 0 评论 -
Go sync.Mutex互斥锁的学习
相比于 Go 语言宣扬的“用通讯的方式共享数据”,通过共享数据的方式来传递信息和协调线程运行的做法其实更加主流,毕竟大多数的现代编程语言,都是用后一种方式作为并发编程的解决方案的(这种方案的历史非常悠久,恐怕可以追溯到上个世纪多进程编程时代伊始了)。比如,在解锁未锁定的写锁或读锁时的表现,又比如,对写操作之间互斥的实现方式。这其中还包括了我的一些理解。因为在一个 goroutine 执行的流程中,可能会出现诸如“锁定、解锁、再锁定、再解锁”的操作,所以如果我们忘记了中间的解锁操作,那就一定会造成重复锁定。原创 2022-11-05 17:27:34 · 1331 阅读 · 0 评论 -
Go 并发编程模型
Go 语言中实现了两种并发模型,一种是依赖于共享内存实现的线程-锁并发模型,另一种则是CSP(Communicationing Sequential Processes,通信顺序进程)并发模型。原创 2022-11-04 23:29:33 · 1157 阅读 · 1 评论 -
Go 中对time包时间和时区处理
整体而言,time 库提供的时间处理函数和方法,基本满足我们的使用需求。有意思的是,Go 时间格式化转换必须采用 Go 诞生时间,确实有够自恋。转载 2022-09-11 14:58:17 · 4327 阅读 · 0 评论 -
Go 高性能编程技法
代码的稳健、可读和高效是我们每一个 coder 的共同追求。本文将结合 Go 语言特性,为书写效率更高的代码,从常用数据结构、内存管理和并发,三个方面给出相关建议。话不多说,让我们一起学习 Go 高性能编程的技法吧。转载 2022-09-05 23:28:16 · 430 阅读 · 0 评论 -
Go 本地缓存选型对比及原理总结
本文主要从日常需求出发,分析了日常业务过程中对本地缓存的需求,再调研了业界可选的一些组件并进行了对比,希望对本地缓存选型上起到一些参考和帮助。最后再对其中比较重要的几个组件如 freecache、bigcache、fastcache、offheap 等做了内部实现的简单介绍。上述内容只是从架构层面展开介绍,后续有时间再从源码层面做一些分析。由于篇幅限制本篇内容并未对 map、sync.Map、go-cache、groupcache 进行介绍。感兴趣的读者可以自行搜索资料进行阅读。转载 2022-08-24 23:27:05 · 1243 阅读 · 0 评论 -
Go标准库:Go template 用法解读
Go 语言内置了两个 template 相关的包:text/template[2]、html/template[3]。两者都是用数据驱动(data-driven)生成模板化的文本,不同的是后者用于生成 html 文本,它可以借助浏览器呈现更好的视觉效果。Go 语言应用的系列文章,我将不会像深度解密系列那样深入到源码,用就完了!毕竟我们没那么多精力去研究所有源码,有了阅读源码的能力,碰到关键的地方再去仔细研究。执行模板时,函数从两个函数字典中查找:首先是模板函数字典,然后是全局函数字典。原创 2022-08-23 01:16:45 · 4391 阅读 · 0 评论 -
Go的map字典及约束
到目前为止,我们看过的集合类的高级数据类型都属于针对单一元素的容器。它们或用连续存储,或用互存指针的方式收纳元素,这里的每个元素都代表了一个从属某一类型的独立值。我们今天要讲的字典(map)却不同,它能存储的不是单一值的集合,而是键值对的集合。什么是键值对?它是从英文key-valuepair直译过来的一个词。顾名思义,一个键值对就代表了一对键和值。注意,一个“键”和一个“值”分别代表了一个从属于某一类型的独立值,把它们两个捆绑在一起就是一个键值对了。..................原创 2022-07-24 16:11:32 · 436 阅读 · 0 评论 -
Go 的数组和切片
这次主要讨论Go语言的数组(array)类型和切片(slice)类型。切片是基于数组的,可变长的,并且非常轻快。一个切片的容量总是固定的,而且一个切片也只会与某一个底层数组绑定在一起。此外,切片的容量总会是在切片长度和底层数组长度之间的某一个值,并且还与切片窗口最左边对应的元素在底层数组中的位置有关系。......原创 2022-07-24 13:19:57 · 2206 阅读 · 0 评论 -
Go如何保证并发读写的顺序?—内存模型
谨慎地使用这些保证,能够让你的程序按照设想的happens-before关系执行,但是不要以为完全理解这些概念和保证,就可以随意地制造所谓的各种技巧,否则就很容易掉进“坑”里,而且会给代码埋下了很多的“定时炸弹”。比如,Go里面已经有值得信赖的互斥锁了,如果没有额外的需求,就不要使用Channel创造出自己的互斥锁。当然,我也不希望你畏手畏脚地把思想局限住,...原创 2022-07-15 23:22:49 · 773 阅读 · 0 评论 -
Go为什么能这么“快”?
Go 从 2009 年正式发布以来,依靠其极高运行速度和高效的开发效率,迅速占据市场份额。它为什么能这么“快”呢? 下面看看Go 程序为了实现极高的并发性能,其内部调度器的实现架构(G-P-M 模型),以及为了最大限度利用计算资源,Go 调度器是如何处理线程阻塞的场景。...转载 2022-07-10 22:03:12 · 1031 阅读 · 0 评论 -
Go flag 命令行参数解析
Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。相关文档官网文档:https://pkg.go.dev/flag 中文官网:https://studygolang.com/pkgdoc一、基础知识1.1 参数类型flag包支持的命令行参数类型有bool、int、int64、uint、uint64、floatfloat64、string、duration。flag参数 有效值 字符串flag 合法字符串 整数flag ...转载 2022-04-27 23:37:55 · 658 阅读 · 0 评论 -
Go 如何快速升级安装 Go 1.18
Go 官方推荐的 Go 升级方法是先安装新版本的下载器,再使用下载器去安装新版本的 Go,总结一下就是如下三条命令转载 2022-03-23 09:50:11 · 9581 阅读 · 0 评论 -
Go 调试工具:gdb vs dlv
通过log库输出日志,我们可以对程序进行异常分析和问题追踪。但有时候,我也希望能有更直接的程序跟踪及定位工具能够帮助我们更方便快捷的追踪、定位问题,最直观的感觉还是使用调试器。Linux平台下,原生的C/C++程序,我们往往使用gdb进行程序调试,切换到Golang,我们同样还是可以使用gdb进行调试。同时我们还可以使用golang实现的调试器dlv进行调试。以下内容是我对gdb以及dlv使用及对比总结转载 2022-03-11 11:09:34 · 1950 阅读 · 1 评论 -
Go 定制JSON序列化
Go是在什么时候将特殊类型序列化为JSON,它首先查看对应的类型是否实现了MarshalJSON()方法。如果实现了,GO将调用这个方法来决定JSON编码格式。转载 2022-02-22 09:07:57 · 462 阅读 · 0 评论 -
Go 使用json时的陷阱
本文是关于使用Go的encoding/json包时需要注意的一些会让人迷惑的内容。如果您仔细地阅读官方包文档,就会发现其中有许多内容都提到了,所以从理论上讲,这些内容应该不会让您感到惊讶。但其中有一些根本没有在文档中提到,或者至少没有明确指出-值得注意!转载 2022-02-22 00:12:08 · 2246 阅读 · 0 评论 -
Go 中Defer 核心知识点
defer的执行顺序、return、初始化等情况梳理转载 2022-02-20 17:21:45 · 268 阅读 · 0 评论 -
Go 中make和new有什么区别
make和new都是实现堆内存分配,但是new是给某个类型分配一块内存,并初始化为0值返回类型引用、而make是给 map、slice、chan 三种类型分配堆内存返回类型本身,并不会初始化为0值转载 2022-02-20 16:45:17 · 404 阅读 · 0 评论 -
Go 包循环依赖如何分析 import cycle not allowed
相信不少初学者 在写 Golang 程序都遇到过 import cycle not allowed 问题。转载 2022-01-30 00:15:10 · 1248 阅读 · 0 评论 -
Go常用加密解密算法总结(AES、DES、RSA、Sha1MD5)
在项目开发过程中,当操作一些用户的隐私信息,诸如密码、帐户密钥等数据时,往往需要加密后可以在网上传输。这时,需要一些高效地、简单易用的加密算法加密数据,然后把加密后的数据存入数据库或进行其他操作;当需要读取数据时,把加密后的数据取出来,再通过算法解密。转载 2022-01-21 00:42:51 · 3315 阅读 · 0 评论 -
【Golang】map 和 switch 如何选?match 又是什么?
看到标题别惊讶,虽然 map 和 switch 似乎没啥关系,但有些场景它们俩都可以用。转载 2021-11-28 16:11:26 · 1001 阅读 · 0 评论 -
【GoLang】有必要刻意转go吗?
在当今最流行的编程语言列表里,Go语言一直是名列前茅。近几年Go语言在互联网圈很火,国外如Google、facebook、AWS等暂且不谈,国内如阿里巴巴、腾讯、百度、抖音、小米、京东、360、网易、新浪、爱奇艺、哔哩哔哩等都已开始大规模使用Go语言开发各种应用。身边好多研发同学都在疑惑,自己是不是需要转Go呢?1. go 语言的优势 强悍并发性能(Go内置Goroutine协程调度机制,处理并发性相当强悍); 开发速度快(这个奇特的语言代码简易度接近Python,运行速度媲美C语言转载 2021-03-18 09:22:24 · 655 阅读 · 0 评论 -
【GoLong】使用 go mod 管理Go项目依赖
1. 前言go modules是 golang 1.11 新加的特性。现在1.12 已经发布了,是时候用起来了。Modules官方定义为:模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。2. 开启go modules 模式把 golang 升级至少到 1.11版本以上 设置GO111MODULE 2.1...转载 2021-03-16 11:31:06 · 1103 阅读 · 0 评论