golangci-lint配置与使用

1.golangci-lint是什么 golangci-lint按照官方的说法是用于go语言的代码静态检查工具集(因为包含它多种 Go 代码检查工具)。 官网 https://golangci-lint.run/ 特性: 1.快速:并行非执行 linters,可以复用 Go构建cache和caches分析结果 2.配置文件基于yaml语法进行配置 3.可以与常见开发工具集成,例如:VS Code、Sublime、Goland、Emacs、Vim、Atom、Github Actions 4.包含了很多 linters,不需要安装 5.执行结果输出带有美观,不仅带有颜色,还有源码行号和标...

Golang,编程工具 2022/06/22 214℃ 0条

go中slice append扩容的一些细节

1.问题与事件 事件:一个朋友面试某家公司 问题:对容量为4的int切片追加5个元素,最终切片的容量是多少? 针对该问题,朋友回答:16 该问题考察slice扩容: ①在容量小于1024时,在原基础上2倍扩容 ②大于1024时,在原基础上1/4的扩容 面试官回答说:10 让回去自己试一下,看看具体是多少? 事后分析了一下,能确定的是:面试官提出的问题,有4种写法。 2.同一个问题不同写法的不同结果 在4种写法执行之前,你觉得最终的容量cap分别会是多少? func TestSliceAppend(t *testing.T) { SliceAppend0() Sl...

Golang,编程原理 2022/06/14 138℃ 0条

利用质数随机遍历集合的一种实现

有个随机遍历数据集合的需求,描述如下: ① 从集合的某个随机位置开始遍历 ② 随机获取集合中剩余数据 ③ 重复步骤②,直到遍历完整个集合 当看到这个需求时,不知道你是否会想到什么实现方式? 最近在追溯go底层源码时发现,在调度器从其他 P 中 steal 可用 goroutine 时利用质数的特性,采用了一种特殊算法随机遍历 allp 数组。觉得很是经典,特此记录一下。 例如:通过下标随机遍历数组中的 8 个元素,则最终遍历数组的下标可能是 [0,1,2,3,4,5,6,7] 中的任意一种随机排列。 遍历步骤: ① 计算小于等于 count (这里是8) 的所有质数,得到数组 [1,3...

Golang,算法技巧 2022/05/10 229℃ 0条

go字符串无拷贝转换切片的一个问题

1.字符串无拷贝转换切片 提起 字符串无拷贝转换切片 这个话题,可能很多人会想到下面一段代码: func string2Slice(s string) []byte { return *(*[]byte)(unsafe.Pointer(&s)) } 这段代码利用了指针进行强转,并且在实现过程中不会出现数据拷贝,简单、强大! 2.同一切片多次获取容量结果不相同 来看一个测试用例: package test import ( "fmt" "testing" "unsafe" ) func string2Slice(s string) []byte ...

Golang,编程原理 2022/04/22 236℃ 0条

go泛型中类型参数列表为什么用中括号?

2022.3.15当天,在国内打假国人声讨奸商的时候,go官方发布了1.18版本。对于该版本来说,可能是近几年发生变化最大的一个版本。因为,有一个千呼万唤始出来的功能:泛型(Generics)。说起泛型,那些熟悉C++、Java的开发人员可能并不陌生。但是,对于那些没有接触过泛型的人来说,就需要花点时间来适应这一特性。 官方博客: Go 1.18 is released! (https://go.dev/blog/go1.18) 1. go泛型 talk is cheap, show the code。 对于常见的:求两个有符号整数最大值这个功能 准备了两份代码,分别是未使用泛型以及...

Golang,编程原理 2022/03/26 425℃ 0条

Go 构建约束的使用方式

在go中进行编译时,可能会带一些指示条件(如:不同平台、架构等)让编译器选择满足条件的代码参与编译,将不满足条件的代码舍弃。这就是条件编译,也可称为构建(编译)约束。 目前,支持的构建约束有2种使用方式: 1.文件后缀 2.编译标签(build tag) 两者区别: 文件后缀方式多用于交叉编译 (跨平台)。 编译标签方式多用于条件编译 (也可用于交叉编译)。 构建约束官方文档 https://pkg.go.dev/cmd/go#hdr-Build_constraints 文件后缀的使用方式 编译器根据文件后缀来选择具体文件来参与编译操作,格式如下: $filenamePrefix...

Golang 2022/03/10 983℃ 0条

grpc-go设置keepalive

每个grpc请求都是 stream,Keepalive 能够让 grpc 的每个 stream 保持长连接状态,适合一些执行时间长的请求。Keepalive 支持在服务端和客户端配置,且只有服务端配置后,客户端的配置才会真正有效。 server 端实现 https://github.com/grpc/grpc-go/blob/master/examples/features/keepalive/server/main.go keepalive配置参数是针对整个连接的 grpc-go基于http/2实现,可以多路复用。即:多个请求复用同一个连接,每个请求都是一个单独的stream pa...

Golang 2022/02/05 1431℃ 0条