https://earth.google.com/web/@29.996822,-90.136449,0a,1686d,30y,270h,30t,0r/data=KAI?utm_source=referral&utm_campaign=earthview&utm_term=extension

优化GO语言sort.Slice排序

优化GO语言sort.Slice排序 介绍 众所周知,go对复杂Slice排序有两种方法,分别是: sort.Slice(x any, cmp func(i, j int)) 实现sort.Interface接口,调用sort.Sort()进行排序 今天在写Gazelle时候,写到了一个需要Slice排序的场景。突发奇想,将上列两种方法对比,哪一种速度更快。Ps. Benchmark写法和go test -bench命令自行百度 开始 新建一个sort_test.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 package sort import ( "sort" "testing" ) type testSlice []struct { order int } func (t testSlice) Len() int { return len(t) } func (t testSlice) Less(i, j int) bool { // > 是倒序 // < 是升序 return t[i]....

2023-09-22 14:03:25+08:00 · 3 分钟 · 563 字 · lazychanger
hello world

Go项目两种结构

Go项目两种结构 go 项目的目录结构没有一个官方的标准,但是有一些社区推荐的实践和约定。一般来说,go 项目的目录结构可以分为两种类型: 结构化目录结构:结构化目录结构主要用于 go 应用,即可执行的程序,通常比较复杂,需要考虑开发、测试、部署、项目管理等多个方面。 golang-standards/project-layout helm kubernetes 平铺式目录结构:平铺式目录结构主要用于 go 包,即代码框架或库,通常比较简单,只需要考虑导出的接口和文档。 github.com/patrickmn/go-cache github.com/jmoiron/sqlx github.com/go-gorm/gorm 结构化目录 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ├── build # 打包和持续集成 │ ├── docker # Docker 镜像 │ ├── package # 打包脚本 │ └── release # 发布脚本 ├── cmd # 主应用 │ └── myapp # 应用入口 │ └── main....

2023-06-27 10:20:42+08:00 · 2 分钟 · 222 字 · lazychanger
https://earth.google.com/web/@36.414691,-5.157423,96a,112d,30y,270h,30t,0r/data=KAI?utm_source=referral&utm_campaign=earthview&utm_term=extension

GoReleaser工具与Go构建技巧

GoReleaser工具与Go构建技巧 GoReleaser GoReleaser 的创建是为了解决我们都曾遇到过的一个问题:发布软件很无聊而且容易出错。 为了解决这个问题,我们最终都创建了脚本来自动化工作,并取得了不同程度的成功。 一般来说,这些脚本往往不可重用,并且依赖于许多其他工具——这使得该进程很难在其他机器上运行。 GoReleaser 的目标是让所有这些脚本都过时:不再编写脚本,而是编写一个简单的 YAML 配置文件; 您(通常)只需要一个 goreleaser 二进制文件,而不是许多工具。 然后,您只需运行一个命令即可构建、存档、打包、签名和发布工件。 我们努力让您(我们的用户)轻松地为您的用户做最好的事情。 这就是为什么我们专注于提供易于使用的集成、良好的默认设置和许多教程以及有助于缓解供应链安全问题的工具、包管理器、go mod 代理等。 通过这种方式,可以轻松提供易于安装的软件包,例如带有签名的校验和、软件物料清单和可复制的二进制文件。 原本地址 总结来说:GoReleaser的作用是让你可以用最少的步骤和时间,把你写的Go程序打包成各种格式,然后发布到网上,让别人可以下载和使用。 使用 1. 安装 2. 项目初始化GoReleaser 1 2 # 安装goreleaser cli工具 goreleaser init 3. 修改配置。GoReleaser配置文档 下面我使用的配置,可以用作于生产使用。也可以参考:ArgoCD GoReleaser 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 before: # 前置构建配置,可以放包检测、单元测试、go generate等,同步运行,失败就停止发布。 hooks: # You may remove this if you don't use go modules....

2023-06-26 14:44:21+08:00 · 4 分钟 · 764 字 · lazychanger
hello world

Docker&Go 压缩镜像体积

Docker&Go 压缩镜像体积 涉及内容如下: upx: 二进制文件压缩,一般可以压缩50%左右 go build -ldflags 编译优化,可以参考Go gcflags/ldflags 的说明 Docker的空镜像scratch Docker编译优化: 层减少、多阶段构建 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 FROM golang:alpine as build WORKDIR /go/src/app COPY . . RUN apk --no-cache add ca-certificates upx && \ CGO_ENABLED=0 go build -ldflags '-s -w -extldflags "-static"' -o /go/bin/app ./main.go \ && upx -9 /go/bin/app FROM scratch COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY --from=build /go/bin/app /app ENTRYPOINT ["/app"] 最终压缩体积如下

2023-06-17 10:53:15+08:00 · 1 分钟 · 75 字 · lazychanger
hello world

连接池

连接池的定义与主要功能 在软件工程中,连接池(英语:connection pool)是维护的数据库连接的缓存,以便在将来需要对数据库发出请求时可以重用连接。连接池用于提高在数据库上执行命令的性能。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序发出的请求,既昂贵又浪费资源。在连接池中,创建连接之后,将连接放在池中并再次使用,这样就不必建立新的连接。如果所有连接都正在使用,则创建一个新连接并将其添加到池中。连接池还减少了用户必须等待建立与数据库的连接的时间。1 连接池的数据结构 一般来说连接池的大小是一个动态的范围,连接池内部的连接实例2数量会随着应用程序的峰值而变化; 高峰时期连接池内连接实例2数量高,低峰时期连接池内连接实例2数量低;在应用程序的高低峰 转变过程中,利用堆栈3的数据结构(先入后出)快速标记出闲置实例,方便定期清理; 结构示意图 连接池的使用 连接池的使用我个人认为有两种方法:第一种是块使用法,第二种是行使用法;其中的块与行的定义标准是以代码作用域为参考标准; 块使用法 块使用法就是我们在使用连接池时候将连接实例取出后自行放回; 该种使用方法一般在代码中代码作用域比较大块; 伪代码如下类似: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package main import "time" func main() { // 从连接池中取出实例 instance := pool.pop() defer pool.push(instance) instance.do("hello world 1") time.Sleep(time.Millisecond * 10) instance.do("hello world 2") time.Sleep(time.Millisecond * 10) instance.do("hello world 3") time.Sleep(time.Millisecond * 10) } 行使用法 行使用法是我们利用代理类或代理方法接管对连接实例的操作; 在业务代码上是无需从连接池中取出实例再操作; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package main func proxy(command string) { instance := pool....

2022-08-31 16:23:32+08:00 · 3 分钟 · 605 字 · lazychanger