Go学习理解
文章平均质量分 76
Go 经常会使用到的应用层代码
i-neojos
古之成大事者,不惟有超世之才,亦必有坚忍不拔之志
展开
-
go test coverage 单测覆盖率
单元测试的最终统计标准就是单测覆盖率,统计单测总体覆盖了多少行代码。一般来说,我们只需要关注增量代码的覆盖率,而非全量代码。增量代码就是本次迭代改动的代码,比如本次迭代改动了100行代码,我们保证单测能覆盖到这 100 行代码就行。在命令行覆盖率的统计指令,会生成一个 coverage 文件,基于这个 coverage 文件,我们结合 go tool 工具,就可以图形话展示代码覆盖率情况。原创 2023-05-11 08:20:30 · 3306 阅读 · 0 评论 -
go 内存分配
关注 go 语言内存分配策略,主要是想了解 go 的性能。申请不同大小的内存,性能开销是有差别的,申请内存越大,耗时也越久,性能也越差。原创 2023-07-30 23:00:32 · 270 阅读 · 0 评论 -
Go参考TcMalloc内存分配
关于 span 和 class 的概念,内存的最小单位是 page,而 span 用来对 page 做管理,不同类型的 span 由不同数量的 page 组成,下图中,span A 由 2 个page 组成,span B 由 3 个 page 组成。ThreadCache 属于线程管理的内存,对象所需的内存申请在线程内部完成,不涉及到加锁的开销,主要负责小对象的内存分配。中对于 TCMalloc 的介绍,和第一张图相比,这张图在介绍的时候,拆成了三个模块:front-end 负责快速分配、回收内存;原创 2023-07-13 00:20:47 · 289 阅读 · 0 评论 -
Go代码片段品鉴
作为一个服务端开发,熟悉我们服务的业务至关重要,但我们换工作的时候,也经常会换到别的业务场景下。比方说,我在成人教育的行业工作了2年,跳槽到了支付的行业。这么看的话,业务并不能成为服务端工程师的求职门槛。但我们可能会有被评价过缺少产品 sense,限制我们始终工作在一线。抛开业务的特殊场景,我们所开发的功能其实大同小异,面临的问题也有很高的重复性。当遇到之前解决过的问题,我经常会回忆之前写过的代码,代码本身可能很烂,但总觉得它经过了线上的考验,是信的过的。但很严肃的结果是,自己完全回忆不起来。原创 2023-06-18 20:36:56 · 871 阅读 · 0 评论 -
go test 包外测试
结合图示,go 包外测试就是 main_test.go 中声明的 package 不再是 main,而是 main_test。现在包外测试已经搞明白了:同一个目录下,比如声明的 package 为 ol,还可以声明 ol_test 的包。形如下面这样,但 main_test.go 和 main.go 声明的 package 是相同的。虽然 ol 和 ol_test 在同一个目录下,但因为它俩的 package 不相同,两个包的就是独立隔离的,ol_test 中的单测用例就不能访问 ol 中的私有方法了。原创 2023-06-04 11:10:41 · 940 阅读 · 0 评论 -
时间轮算法
定时任务可以参考这个算法,比如,我们需要每隔5分钟调用线上的回调接口,每天的凌晨1点调用苹果的自动扣费接口,遇到这样的处理场景,我还是会想到 linux 的 crontab,几年前,我们还手动编辑 crontab 来定时执行线上任务,转眼几年过去了,已经看不到 crontab 执行任务的身影了。原创 2023-05-18 00:20:47 · 66 阅读 · 0 评论 -
Go 本地缓存 bigcache
本地缓存已经算是数据库的常规设计了,因为数据直接缓存在机器内存中,避免昂贵的IO开销,数据的读取和写入快到不可思议。本地缓存常驻在内存中,就好像业务逻辑中声明的全局变量一样,不会被垃圾回收。但本地内存也会导致单机内存使用率变高,频繁的GC导致系统性能下降。在说 Go 本地内存之前,我们先看看别的数据库是怎么使用本地内存的。原创 2023-05-16 23:50:35 · 1616 阅读 · 0 评论 -
Goland Run Targets 如何使用
我们依赖的开发环境会经常面临系统升级等问题,升级之后很多依赖可能就不能使用了,之前稳定运行的程序也可能出问题。因为 docker 的存在,我们可以使用 docker 来创建一个稳定的执行环境,再也不需要因为不同的系统、不同的软件版本带来的问题而烦恼了。goland 编译器做的非常好,在之前的工作中,我一直没有接触过 Run Target 这个功能,因为我压根没有遇到过环境问题。但如果你运行的代码需要和系统打交道,这个功能就显得非常重要。因为我们所使用的第三方库很少使用能兼容所有的系统。原创 2023-05-07 18:09:04 · 247 阅读 · 0 评论 -
GoMonkey Patching in Go
gomonkey 用来给函数打桩,这种使用一个新的方法实现来替换原来的实现逻辑,怎么看都觉得很神奇。举个例子,在单测中方法 json.Marshal 可以被 gomonkey 覆写成另一种逻辑实现,我准备从原理和使用的角度来看看 gomonkey。主要是来看看。原创 2023-05-06 22:16:17 · 713 阅读 · 0 评论 -
Go test基础用法
当直接使用IDE进行单元测试时,有没有好奇它时如何实现的?比如GoLand写的测试用例。所有的代码都需要写测试用例。这不仅仅是对自己的代码负责,也是对别人的负责。最近工作中使用glog这个库,因为它对外提供的方法都很简单,想封装处理一下。但却遇到了点麻烦:这个包需要在命令行传递log_dir参数,来指定日志文件的路径。所以,正常运行的话,首先需要编译可执行文件,然后命令行指定参数...原创 2018-05-02 08:59:52 · 711 阅读 · 0 评论 -
逃逸分析反思
英文名 Escape Analysis ,逃逸分析用来确定变量是否会分配在堆上。堆分配的效率要明显低于栈分配的效率,而且堆内存需要依赖 GC 做回收,GC 反过来又会影响程序性能。变量逃逸是在编译阶段确定的,我们可以通过减少变量逃逸来提高程序性能。Go 语言可以指定编译参数来分析变量逃逸。参数 gcflags 用来指定编译参数,逃逸分析重要的两个参数是 -m 和 -l,-m 用来打印逃逸分析的优化策略,-l 用来禁止内联优化,完整的编译指令如下。原创 2023-04-18 07:52:38 · 60 阅读 · 0 评论 -
context 浅析
在缺少直接调用关系的两个函数之间传递数据,一般都会考虑使用 context,而 context 也被用来存储整个请求链路的公参信息,用户 uid、链路 traceID、特定的业务参数等。函数第一个参数类型设置为 context.Context 也是 Go 的默认写法,如果你对是否指定 ctx 作为函数的第一个入参,感觉到模棱两可,那就指定它吧。原创 2023-04-15 09:03:44 · 459 阅读 · 2 评论 -
func OpenDB
// OpenDB opens a database using a Connector, allowing drivers to// bypass a string based data source name.//// Most users will open a database via a driver-specific connection// helper function t...原创 2019-06-01 18:35:08 · 338 阅读 · 0 评论 -
func SetMaxIdleConns
// SetMaxIdleConns sets the maximum number of connections in the idle// connection pool.//// If MaxOpenConns is greater than 0 but less than the new MaxIdleConns,// then the new MaxIdleConns will ...原创 2019-05-31 13:32:11 · 916 阅读 · 0 评论 -
Go语言time package基础用法
使用Go语言处理时间使用的是纳秒为单位,使用起来还是挺方便的原创 2017-09-17 23:09:10 · 541 阅读 · 0 评论 -
Go语言中如何控制并发
在实际的生产环境中,不可能让go routine无限的任意的去增加,有时候需要控制最大的并发数量。本文主要介绍使用channel控制并发的。原创 2017-09-17 17:19:50 · 915 阅读 · 0 评论 -
Redis使用内存大小评估
申请Redis资源时,总需要考虑该申请多大内存空间的实例。该如何评估呢?我们先从Go语言中计算某个类型的对象占用内存的空间说起下面是一个对象声明,我们可以通过Go官方提供的方来来计算对象占用的空间。但这其实计算的是第一层结构占用的空间,如果结构体内部有指针的话,还需要考虑实际指针实际指向的类型大小。type Live struct { TeacherId int64 Name string Status *int64}size := unsafe.Sizeof(Live{})原创 2022-04-28 07:26:08 · 2645 阅读 · 0 评论 -
pprof 性能优化点
两种使用 pprof 定位问题的形式:在 test 用例中使用 runtime/pprof 中提供的方法在 web 服务中引入 "net/http/pprof"定位问题的过程,经常会用到火焰图。但火焰图也只能算是一个扩展加分项,数据同样还是从go tool pprof中获取的。一般也只看cpu、和堆栈的内存分配情况。但我依旧存在一个疑问,针对CPU的Profile文件,在执行top命令时,这些列头究竟是什么意思?换一句话描述我的问题, flat 和 cum 的区别是什么? flat flat原创 2020-09-24 08:26:07 · 6485 阅读 · 2 评论 -
Gin使用
Gin对net/http包做了封装,支持路由、中间件等特性,极大的方便对Http Server的开发。文章通过一个Test例子,来简要介绍。对于特别基础的部分,请阅读参考文章。接口测试Go中testing包为程序自测提供了便利。可以查阅之前写的博客Go test基础用法,对其内容,我还是挺满意的。使用Postman对于接口测试,很多情况都在使用Postman这样的工具。首先在本地启...原创 2019-01-05 09:49:59 · 584 阅读 · 0 评论 -
Go 调度模型(二)
title: Go 调度模型(二)date: 2019-03-30categories: 2019-03tags: [translate,golang]author: 付辉真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血。这是怎样的哀痛者和幸福者?然而造化又常常为庸人设计,以时间的流驶,来洗涤旧迹,仅使留下淡红的血色和微漠的悲哀。在这淡红的血色和微漠的悲哀中,又给人暂得偷生,维持着...原创 2019-03-30 22:37:35 · 564 阅读 · 0 评论 -
GoLand如何编译带有构建标签的程序
简单构建一个项目,如下是mian.go文件package main// 条件编译-构建标签-如何使用IDE编译和识别func main() { RequestByRpc()}模拟带有一个http tags的文件// +build httppackage mainimport "fmt"func RequestByHttp() { fmt.Println("using http method")}模拟带有一个rpc tags的文件// +build rpcpacka原创 2020-10-06 00:48:49 · 2383 阅读 · 2 评论 -
Trace链路笔记(二)
defer Trace看到了网上分享的一篇文章,关于 defer 实现 Trace 的想法,作为井底之蛙的自己,感觉到特殊的神奇之处。在前在调试 MySQL 的时候,就有好奇 M有SQL 的 Trace 日志是如何打印的,看了 Go 的实现,还补充了点遗憾。Go 程序的执行单元是 Goroutine,所以,我们打印的 Trace 也应该是基于 Goroutine 的。下面的代码获取了当前 Goroutine 的信息。函数到底有什么神奇指出,居然获取到了 Goroutine 的信息。func getGI原创 2020-12-15 00:06:35 · 256 阅读 · 0 评论 -
golang处理0x08不可见unicode字符
golang An invalid XML character (Unicode: 0x8) was found原创 2020-03-03 22:46:57 · 4245 阅读 · 0 评论 -
Trace链路笔记
OpenTracing provides two functions to propagate the trace context: “extract (format, carrier)” and “inject (SpanContext, format, carrier)”. “extract()” retrieves the tracing context from a carrier, usually it is the HTTP header. “inject” puts the tracing .原创 2020-09-29 00:11:04 · 631 阅读 · 0 评论 -
Go 反射
对interface类型操作,如何对内部的值进行处理和分析。比如判断interface是否底层存储的是struct类型,以及该struct是否含有某个特定的Field值。interface类型包含两部分内容:dynamic type和dynamic value。当转换为interface类型后(操作是默认的),原类型下声明的方法,interface类型就无法再调用了。实际工作中,interface类型会接收任意类型的值,处理的过程很多都是通过reflect实现的。原创 2023-03-19 22:49:03 · 198 阅读 · 0 评论 -
异或运算思考
const MaxUintptr = ^uintptr(0)// MaxUint64 = 1<<64 - 1 有必要对比一下 math 包下的常量声明,这两个值大小相等首先需要解释 ^ 的符号含义,表示按位异或。但按位异或操作的是两个数,这里 Go 的写法显然不是。符号代表什么含义呢?答案是 Go 没有专门的一元取反运算符,取而代之的便是 ^。它不仅可以作为按位异或的运算符,还可以作为一元取反运算符。关于异或运算符,在知乎上有一个比较有趣的描述,虽然有点偏离主题,但重在有趣:“男人和女原创 2021-01-24 15:14:36 · 523 阅读 · 0 评论 -
Go中MySQL连接池
使用MySQL的链接池可能存在如下问题:在客户端连接池中的一条空闲链接,可能是一条已经被MySQL服务端关闭掉的链接。如果不使用连接池,也会出现别的问题原创 2017-09-17 17:55:41 · 7692 阅读 · 0 评论 -
RoaringBitmap 借鉴思考
RoaringBitmap的借鉴思考原创 2023-03-10 07:54:21 · 322 阅读 · 0 评论 -
go 动态调整协程池
go协程和java线程对比原创 2023-03-09 07:56:45 · 337 阅读 · 0 评论 -
Text Template 模板
准确的说,我也不知道自己在干什么最近,使用到了 html/template 和 text/template 类库,通过使用模板,让项目清爽了不少。在应用内推送模式消息时,我们可以定义文本模板。下面是消息示例:直播名称:Neojos 如何协作直播ID:1在线人数:10直播地址:http://neojos.com不使用模板当然也可以,使用 fmt.Sprintf() 同样可以实现。但应对复杂的数据模板时,fmt.Sprintf() 可能会比较麻烦。比如,我们要发送的消息内容为:| 时间 |.原创 2021-04-10 22:42:01 · 405 阅读 · 1 评论 -
sync map思考
sync map 作为解决 map 并发读写问题的补充,用法上其实不复杂,有些惋惜的是,不支持 len 统计数量的方法。map 并发读写算得上一个非常严重的问题,会导致服务宕机,为了避免 map 的并发读写,一种解决办法是直接使用类似 mutex 的加解锁方式,另一种就是使用 sync map 来替换。原创 2023-03-03 23:30:37 · 312 阅读 · 0 评论 -
在Go中实现可选参数
阅读了文章 Functional Options in Go: Implementing the Options Pattern in Golang 之后,感觉内容很实在,推荐大家阅读原文。假设我们需要提供一个获取 “笔记信息” 的接口,它包括内容、阅读数、作者、创建时间、标签、分类等等信息。但并不是所有的调用方都需要全量的笔记信息,有的调用方可能只需要笔记的作者信息就可以。一般来说,我们会如何处理这种情况呢?如果我们要新返回一个元数据信息,比如是否私密(Private),又该如何处理呢?函数参数方式原创 2020-09-23 10:03:26 · 897 阅读 · 0 评论 -
go atomic 原子操作
atomic 包使用介绍原创 2023-02-24 08:01:13 · 547 阅读 · 0 评论 -
go size class 内存分配思考
浏览到的,让我也有机会反思一下 go 内存管理。网络上,go 内存管理方面的介绍挺多的,面试的时候,偶尔也会被问到内存管理。而且,从 go1.15 到 go1.16 在 size class 上引入了新的内存块,能直观的看出来这种变化,也很有必要记录一下。原创 2023-02-19 17:31:02 · 588 阅读 · 0 评论 -
Go 数组和切片比较
切片的底层数据结构是数组,所以,切片是基于数组的上层封装,使用数组的场景,也完全可以使用切片。原创 2023-02-18 15:53:42 · 814 阅读 · 0 评论 -
go 命令行工具整理
这里会整理可能会使用到的命令行参数,比如 go build、go run,诸如此类。了解这些内容对我们工作会有什么帮助吗?更多的时候,是能让我们理解代码编译的意图,或者,给我们一种排查问题的手段。比方说,-race 属性,博客中也有说到这个属性,用来检测数据动态竞争。-test 属性,中也有用到这个属性,等等吧。原创 2023-02-12 16:55:42 · 600 阅读 · 0 评论 -
字符串压缩编码
gzip 是比较常见的压缩方式,web 服务中也经常开启 gzip 压缩。HTTP 传输的内容通过 gzip 压缩之后,也可以节省带宽,提高数据传输效率,缺点是要耗费些 CPU。这篇文章还会介绍其他的一些编码方式(pb、base64),从编码后内存占用、编码原理等来说一会。就好像评估一个算法的优劣一样,空间复杂度和时间复杂度不可兼得。通过 gzip 压缩后,降低了存储空间,但也引入了压缩和解压缩的性能开销。在深入 gzip 之前,我们先来拿捏一个软柿子:base64编码。原创 2023-02-04 10:57:23 · 1281 阅读 · 0 评论 -
Go 泛型揣摩
在 go1.18 引入了泛型之后,为了不至于让人感觉:这个渣渣不假装对新事物不敢兴趣?我第一时间就去看了泛型的使用。但现在已经记不起来了,工作中经常使用的话,可能还会好一点,我们线上的版本是 go1.15,后来升级到了 go1.17,但还是和泛型隔了一个版本。原创 2023-02-10 08:42:17 · 315 阅读 · 0 评论 -
toml 格式文件解析
掌握 yaml 的解析,核心在于了解 yaml 的设计理念:**TOML is designed to map unambiguously to a hash table**。toml 被设计从无序的 hash 表结构,键值对的方式。键的类型是字符串,值得类型比较多样,可以是单值类型、数组、结构体原创 2023-02-05 10:51:32 · 3618 阅读 · 0 评论 -
goland 编译器扩展功能
选用 goland 作为 go 语言编辑工具,它集成了很多便捷的功能,辅助我们提高开发效率。我列举一下,感兴趣的可以评论扩展。原创 2023-02-05 09:10:00 · 784 阅读 · 0 评论