深度思维者

永远年轻,永远热泪盈眶

随笔分类 -  Go进阶

go编程进阶,知其然亦知其所以然
摘要:1. panic 在什么情况下使用panic? 在程序启动的时候,如果有强依赖的服务出现故障时panic退出 在程序启动的时候,如果发现有配置明显不符合要求,可以panic退出(预防编程) 其他情况下只要不是不可恢复的程序错误,都不应该直接panic,应该返回error 在程序入口处,例如gin中间 阅读全文
posted @ 2021-08-08 23:51 failymao 阅读(643) 评论(0) 推荐(0) 编辑
摘要:1. 简介 为了确保一致性构建,Go引入了go.mod文件来标记每个依赖包的版本,在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地,以便下次构建。 考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod文件并不能保证一致性构 阅读全文
posted @ 2021-08-03 07:03 failymao 阅读(9896) 评论(0) 推荐(1) 编辑
摘要:1. 简介 GOPATH模式下,依赖包存储在$GOPATH/src,该目录下只保存特定依赖包的一个版本,而在GOMODULE模式下,依赖包存储在$GOPATH/pkg/mod,该目录中可以存储特定依赖包的多个版本。 需要注意的是$GOPATH/pkg/mod目录下有个cache目录,它用来存储依赖包 阅读全文
posted @ 2021-08-02 23:00 failymao 阅读(609) 评论(1) 推荐(0) 编辑
摘要:1.简介 在go.mod中通常使用语义化版本来标记依赖,比如v1.2.3、v0.1.5等。因为go.mod文件通常是go命令自动生成并修改的,所以实际上是go命令习惯使用语义化版本。 诸如v1.2.3和v0.1.5这样的语义化版本,实际是某个commit ID的标记,真正的版本还是commit ID 阅读全文
posted @ 2021-08-02 07:29 failymao 阅读(1418) 评论(0) 推荐(0) 编辑
摘要:1. 简介 Go module的版本选择机制,其中介绍了一个Module的版本号需要遵循v<major>.<minor>.<patch>的格式,此外,如果major版本号大于1时,其版本号还需要体现在Module名字中。 比如Module github.com/RainbowMango/m,如果其版 阅读全文
posted @ 2021-08-02 07:14 failymao 阅读(1278) 评论(0) 推荐(0) 编辑
摘要:1. 版本选择机制 使用go get <pkg>来获取某个依赖,如果没有特别指定依赖的版本号,go get会自动选择一个最优版本,并且如果本地有go.mod文件的话,还会自动更新go.mod文件. 事实上除了go get,go build和go mod tidy也会自动帮我们选择依赖的版本。这些命令 阅读全文
posted @ 2021-08-01 22:36 failymao 阅读(7763) 评论(0) 推荐(0) 编辑
摘要:1.indirect含义 在使用 Go module 过程中,随着引入的依赖增多,也许你会发现go.mod文件中部分依赖包后面会出现一个// indirect的标识。这个标识总是出现在require指令中,其中//与代码的行注释一样表示注释的开始,indirect表示间接的依赖。 比如开源软件 Ku 阅读全文
posted @ 2021-08-01 17:21 failymao 阅读(3081) 评论(0) 推荐(0) 编辑
摘要:前言 一次性定时器Timer和周期性定时器Ticker,这两种定时器内部实现机制完全相同。创建定时器的协程并不负责计时,而是把任务交给系统协程,系统协程统一处理所有的定时器。 定时器存储 timer数据结构 Timer和Ticker数据结构除名字外完全一样,二者都含有一个runtimeTimer类型 阅读全文
posted @ 2021-07-29 07:40 failymao 阅读(521) 评论(0) 推荐(0) 编辑
摘要:1. 简介 Ticker是周期性定时器,即周期性的触发一个事件,通过Ticker本身提供的管道将事件传递出去。 Ticker的数据结构与Timer完全一样 type Ticker struct { C <- chan Time r runtimeTimer } Ticker对外仅暴露一个channe 阅读全文
posted @ 2021-07-28 07:38 failymao 阅读(6671) 评论(0) 推荐(1) 编辑
摘要:前言 Go提供了两种定时器, 即 一次性定时器, 周期定时器 一次性定时器:定时器只计时一次,结束便停止 周期定时器:定时器周期性进行计时 本篇将快速介绍这两种定时器的基本用法,重点介绍其内部实现原理,最后再给出一个案例揭示使用定时器的风险。 Timer 定时器 简介 Timer实际上是一种单一事件 阅读全文
posted @ 2021-07-27 07:44 failymao 阅读(2947) 评论(0) 推荐(1) 编辑
摘要:单元测试的原则,就是你所测试的函数方法,不要受到所依赖环境的影响,比如网络访问等,因为有时候我们运行单元测试的时候,并没有联网,那么总不能让单元测试因为这个失败吧?所以这时候模拟网络访问就有必要了。 对于go的web应用程序中往往需要与其他系统进行交互, 比如通过http访问其他系统, 此时就需要一 阅读全文
posted @ 2021-07-22 23:39 failymao 阅读(2968) 评论(0) 推荐(0) 编辑
摘要:前言 benchmark测试是实际项目中经常使用的性能测试方法,我们可以针对某个函数或者某个功能点增加benchmark测试, 以便在CI测试中监测其性能变化,当该函数或功能性能下降时能够及时发现。 此外,在日常开发活动中或者参与开源贡献时也有可能针对某个函数或功能点做一些性能优化,此时,如何把be 阅读全文
posted @ 2021-07-20 07:31 failymao 阅读(488) 评论(0) 推荐(0) 编辑
摘要:前言 go test有非常丰富的参数,一些参数用于控制测试的编译,另一些参数控制测试的执行。 有关测试覆盖率、vet和pprof相关的参数先略过,我们在讨论相关内容时再详细介绍。 控制编译的参数 -args 指示go test把-args后面的参数带到测试中去。具体的测试函数会根据此参数来控制测试流 阅读全文
posted @ 2021-07-19 23:16 failymao 阅读(1283) 评论(0) 推荐(0) 编辑
摘要:简介 子测试的一个方便之处在于可以让多个测试共享Setup和Tear-down。但这种程度的共享有时并不满足需求,有时希望在整个测试程序做一些全局的setup和Tear-down,这时就需要Main测试了。 所谓Main测试,即声明一个func TestMain(m *testing.M),它是名字 阅读全文
posted @ 2021-07-18 12:06 failymao 阅读(729) 评论(0) 推荐(0) 编辑
摘要:Go语言提供了go test 命令行工具,使用该工具可以很方便的进行测试。 不仅Go语言源码中大量使用go test,在各种开源框架中的应用也极为普遍。 目前go test支持的测试类型有: 单元测试 性能测试 示例测试 1.单元测试 1.1项目结构 项目中单元测试的结构如下: [GoExpert] 阅读全文
posted @ 2021-07-17 10:10 failymao 阅读(193) 评论(0) 推荐(0) 编辑
摘要:反射概念 反射提供一种让程序检查自身结构的能力: “反射是一种检查interface变量的底层类型和值的机制 反射是困惑的源泉 关于静态类型 你肯定知道Go是静态类型语言,比如int、float32、[]byte等等。每个变量都有一个静态类型,且在编译时就确定了。 那么考虑一下如下一种类型声明: t 阅读全文
posted @ 2021-07-14 23:19 failymao 阅读(576) 评论(0) 推荐(0) 编辑
摘要:1. 前言 go并控制一--Channel go并发控制二--WaitGroup context翻译成中文是”上下文”,即它可以控制一组呈树状结构的goroutine,每个goroutine拥有相同的上下文。 典型的使用场景如下图所示: 图中由于goroutine派生出子goroutine,而子go 阅读全文
posted @ 2021-07-13 08:02 failymao 阅读(617) 评论(0) 推荐(1) 编辑
摘要:1. 前言 上一篇介绍了 Go并发控制--Channel 下一篇会介绍 Go并发控制--Context 使用channel来控制子协程的优点是实现简单,缺点是当需要大量创建协程时就需要有相同数量的channel,而且对于子协程继续派生出来的协程不方便控制。 2. 使用WaitGroup控制 Wait 阅读全文
posted @ 2021-07-12 07:47 failymao 阅读(2384) 评论(0) 推荐(0) 编辑
摘要:1. 前言 我们考虑这么一种场景,协程A执行过程中需要创建子协程A1、A2、A3…An,协程A创建完子协程后就等待子协程退出。 针对这种场景,GO提供了三种解决方案: Channel: 使用channel控制子协程 WaitGroup : 使用信号量机制控制子协程 Context: 使用上下文控制子 阅读全文
posted @ 2021-07-12 07:36 failymao 阅读(2155) 评论(0) 推荐(0) 编辑
摘要:1. 前言 所谓的逃逸分析(Escape analysis)是指由编译器决定内存分配的位置吗不需要程序员指定。 函数中申请一个新的对象 如果分配在栈中, 则函数执行结束后可自动将内存回收 如果分配在堆中, 则函数执行借宿可交给GC(垃圾回收)处理 有了逃逸分析,返回函数局部变量将变得可能,除此之外, 阅读全文
posted @ 2021-07-08 23:09 failymao 阅读(237) 评论(0) 推荐(0) 编辑