0 前言

你是否在使用 Go 的过程中因为类型转换的繁琐而苦恼过?

你是否觉得 Go 语言中的类型断言可能会 panic 而对自己写的代码有那么一点点不放心?

如果你有过如上体验,并且想要找到一个合适的解决方案的话,那么本文推荐的一个用于类型转换的第三方库 cast 绝对是一个值得尝试的选择。

1 cast

cast 是一个极为简洁的第三方库,github 地址:https://github.com/spf13/cast。

项目主页里的头两句介绍就是:

Easy and safe casting from one type to another in Go

Don’t Panic! ... Cast

可见,cast 的主要功能就是类型转换,且没有 panic

Don't panic

2 上手

2.1 安装引入

go mod
go.modrequire github.com/spf13/cast v1.5.0moddownloadtidyimport "github.com/spf13/cast"cast

2.2 使用

2.2.1 常规用法

我们直接通过几个简单的例子来体验一下 cast:

interface{}targetinterface{}string

类型断言的缺点很明显,如果不接收第二个返回值,会有 panic 风险;如果接收第二个参数,则略显繁琐。

ToIntinterface{}"123"intstringstrconvint
cast.ToInt(str)strstring"hello, world!"intint0
Don't panic

2.2.2 带 error 的用法

看到这里,有朋友可能要问了:如果我的逻辑必须判断目标是否转换成功了呢?如果我的转换结果就有可能是 0 呢?我怎么知道这个 0 是转换失败的零值,还是目标原始的真实值?

with error
errorerrorE

2.2.3 很酷的东西

最后再来看一个我觉得很酷的东西:

map

3 性能及原理

如果你只是想使用 cast,那么接下来的内容就可以忽略了;如果你还想深入了解一些 cast,可以看看这一节。

ToInt

明白了吧,没有什么技巧,依然是常规手段进行转换,只是它把各种情况都囊括了进来,做到了足够全面。

errorerror

cast 的源码很短,只有两个文件,加起来不到 2000 行。

所以看到这里,cast 的性能问题就没什么值得讨论的了,一定高不到哪儿去。尤其在泛型已经实装了之后,泛型的性能要远超类型断言、反射之类的技术,因此大家在使用 cast 的时候也请视情况而定。

4 总结

interface{}interface{}interface{}
error