分类 golang 中的文章

Go库003 | 数据库操作

推荐博客文章: 地址: https://www.jianshu.com/p/015aca3e11ae https://www.jianshu.com/p/340eb943be2e https://www.jianshu.com/p/50c9fbf4046c https://www.jianshu.com/p/ee0d2e7bef54 ………

阅读全文

Go随笔 | 字符串拼接性能

Go中的字符串 Go中的字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。由于该编码对占用字节长度的不定性,Go 中的字符串里面的字符也可能根据需要占用 1 至 4 个字节,这与其它语言如 C++、Java 或者 Python 不同(Java 始终使用 2 个字 ………

阅读全文

Go新特性 | 1.18带来的变化

go1.18版本最大的变化是开始支持泛型。 关键字any的引入 1 2 3 4 5 6 7 8 9 10 11 12 13 # 查看当前项目下的interface{}使用情况 $find . -name "*.go"|xargs grep "interface{}" # ………

阅读全文

Go库001 | 常见标准库

sync.Pool Go自带了很多实用的标准库,其中sync.Pool就是用于提高内存使用效率的缓存库,而且是协程安全的。这个库被广泛使用,但是如果没有搞懂其原理,很可能存在卵用错用的情况。下面我们用一个Web开发框架中常见的上下文(RequestContext)缓存池来做介绍。 1 2 3 4 5 6 7 8 9 10 11 12 13 ………

阅读全文

Go随笔 | 内存占用过多对性能的影响

现代CPU一般具有三级缓存,目的是追求性价比。CPU在存取内存的时候存在缓存命中的问题,因此一般内存占用少的程序有更高的缓存命中率,一般性能会更好,但是内存占用的大小究竟对程序性能有多大影响呢?今天我们用WEB框架中常见数据结构的设计来分析一下性能。 Web框架中间件设计 在Web框架中常见的路由数据结构都是数,每个叶子节点代表一条路由, ………

阅读全文

Go随笔 | 如何解决包循环引用

golang为了加速编译,不允许包循环引用。一般只要你的包规划得好,严格规范单向调用链(如控制层 -> 业务层 -> 数据层),不会出现包循环引用问题。可是现实业务往往不会这么理想,同层级之间的不同包经常需要互相引用,下面分享几种解决包循环引用的方案。 方法一:抽象出公共接口包 方法二:提取出子包让其它包共同引用 方法三:提取 ………

阅读全文

Go随笔 | 协程为什么比线程轻量

Golang中GMP的介绍参考:/2020/12/27221039-008-gmp-model.html 操作系统会在物理处理器上调度线程来运行,而Go语言的运行时会在逻辑处理器P上调度goroutine来运行。每个逻辑处理器都分别绑定到单个操作系统线程M。在1.5版本以后,Go语言的运行时默认会为每个可用的物理处理器分配一个逻辑处理器。 ………

阅读全文

Go随笔 | 编译技巧

编译技巧 交叉编译 交叉编译主要是两个编译环境参数 $GOOS 和 $GOARCH 的设定。$GOOS代表编译的目标系统,$GOARCH代表编译的处理器体系结构。 $GOOS可选值如下: 1 2 3 4 5 6 7 8 9 darwin dragonfly freebsd linux netbsd openbsd plan9 ………

阅读全文

Go总结(二十二)| panic异常处理

error和panic 错误 和 异常 是两个不同的概念,非常容易混淆。很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误。 但事实并非如此就好。众所周知,Golang 遵循“少即是多”的设计哲学,追求简洁优雅,就是说如果异常价值不大,就不会将异常加入到语言特性中。 错误指 ………

阅读全文