分类 Go 语言 中的文章

Go 新版本特性

Go 1.21.0 2023-08-08 slices、maps 泛型库:《slices、maps 泛型库终于要加入标准库。。。》 for 循环变量的语义变更:《Go 团队将修改 for 循环变量的语义,新版本即可体验!》 context 可设置取消原因和回调函数:《Context 可以设置取消原因和回调函数了,等的可太久了!》 主版本号支持第三位数字 0:《Go 改版本号规则,主版本号终于支持第三位数字 0 了。。。》 统一标准 log/slog:《Go 十年了,终于想起要统一 log 库了!》 支持自定义 go.env 文件:《支持自定义 go.env 文件,可惜还是有所残缺。。。》 增强约束 Go 程序构建:《go.mod 的……

阅读全文

go-cmp 对象比较

简介 我们经常有深度比较两个 Object 是否相等的场景,比如: 1 如服务重构,新旧服务回包对比; 2 单测验证实际的返回值,标准库提供了 reflect.DeepEqual; 但是相对的,reflect.DeepEqual不够灵活,无法提供选项实现我们想要的行为,例如允许浮点数误差。所以今天的主角 go-cmp 登场了。 go-cmp 是 Google 开源的比较库,它提供了丰富的选项。最初定位是用在测试中。 1 快速使用 先安装: go get -u github.com/google/go-cmp/cmp Equal Diff 总结 go-cmp 非常适合对两个同类型的值进行比较。源码中大量使用熟知的 Option 模式,提供给使用者简洁、一致的接口。这种设计思想也值得我们学……

阅读全文

Proto oneof schema 的使用

1 Preface protobuf 提供了 oneof 语义,表示任选其一;类似于C语言的 union 关键字。 于是想了解下 oneof 语义在 golang 中是如何实现的,下面我们来一探究竟。 具体的用法如下: 1 2 3 4 5 6 7 8 9 10 11 message WechatPay { int64 uuid = 1; } message HelloRequest { string msg = 1; oneof one_of_pay { string noop = 2; WechatPay wx = 3; } } 2 stub 代码分析 使用 protoc 工具会生成如下代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // 定义一个接口,用于类型断言 type isHelloRequest_OneOfPay interface { isHelloRequest_OneOfPay() } type HelloRequest_Noop struct { Noop string `protobuf:"bytes,2,opt,name=noop,proto3,oneof"` } type HelloRequest_Wx struct { Wx *WechatPay `protobuf:"bytes,3,opt,name=wx,proto3,oneof"` } // 接口实现 empty // implements isHelloRequest_OneOfPay interface func (*HelloRequest_Noop) isHelloRequest_OneOfPay() {} // 接口实现 empty // implements isHelloRequest_OneOfPay interface func (*HelloRequest_Wx) isHelloRequest_OneOfPay() {} 3 总结 在 Golang 中, oneof 语义基于一个类型接口,oneof 的每个成员都实现这个接口,方便在Ge……

阅读全文

Go 必须知道的 18 个Go开发库

包含各种使用场景的Go第三方列表。 随着时间的推移,Go语言爱好者已经创建并共享了许多Go框架和库。这些库有不同的功能,从微服务开发到构建web应用程序! 备注:在Go语言中我们都称第三方库为package(包)。 配置文件处理库 配置文件通常以各种格式编写,如JSON和YAML。Go有一个非常有用的包,它使读取和写入各种格式的配置文件成为小菜一碟。 1、Viper:这是一个关于Go应用程序配置处理的完整解决方案,包括12-Factor应用程序。它作用在应用程序中,可以处理所有类型的配置文件和格式。 可以读……

阅读全文

Go 常用的包推荐 (持续更新)

更新日志 2023-12-15 增加 cron, automaxprocs, goquery 常用库介绍 2022-09-05 更新 goup v0.5.2 使用说明 2022-02-13 增加 goup 使用 2021-06-10 增加 go-set 使用 2020-11-17 初始版本 1 Go 常用工具包推荐 1 stringer 为枚举量生成String()方法 go install golang.org/x/tools/cmd/stringer 2 pretty 格式化打印任意 go 对象,开发测试打印大对象,非常有用 (这样就不用json.Marshal再打印) go install github.com/kylelemons/godebug 3 GoMock 2 调试工具 Delve 源码调试工具 安装: go install github.com/go-delve/delve/cmd/dlv@latest 快速上手: 1 2 3 $ dlv debug main.go $ > break main.main $ > continue 3 常用开发库 1 http-router 高性能、可扩展的HTTP路由 2 easyjson 高性能的Json Marshaler, 适用于有schema的Json数据 3 set set集合数据结构,基于原生 map 实现 4 测试框架 1 goconvey 简单易用的go测试框架,……

阅读全文

Go select多路复用, 实现超时机制

1 Preface 我们在 Linux 服务端编程的时候,select/epoll 可以监控多个fd, 并且可以指定超时时间。 那么我们在Go 里面也有select 关键字,那么怎么实现超时机制呢? 在 select 中加入一个 timer channel case rc2 := <-time.After(d): After等待持续时间过去,然后在返回的通道上发送当前时间。 它等效于NewTimer(d)。 在计时器触发之前,底层的计时器不会由垃圾收集器恢复。 如果需要提高效率,请改用NewTimer,如果不再需要计时器,请调用Timer.Stop。 完整代码如下: 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 // 采用 select 实现超时……

阅读全文

Golang 反射 (1)

1 Preface 反射是程序在运行时检查变量和值, 并获取到它们的类型的能力。 很多主流语言都提供了反射语法特性,比如Java, python等; C++语言本身不支持反射, 但是第三方库实现了反射特性, 比如 google 的 protobuf。 如果支持反射,解决某些场景的问题,可以变得简单。 比如通过struct/class, 生成对应的建表语句,根据生成 insert 语句(批量将CSV导入数据库)等。 在之前的文章中,我们了解了如何在 Java/C++ 中使用反射: Java-反射机制 protobuf-反射 2 Go 反射 Go语言中使用空的接口,表示任一类型(可以理解为Any……

阅读全文

什么是鸭子类型(duck typing)

1 duck type

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。

duck-type

比如在 python 中,有很多 file-like 的东西,比如 StringIO, GzipFile, socket; 它们有很多相同的方法,我们把它们当作文件使用。

……

阅读全文

最近文章

分类

友情链接

标签

其它