01简介在Golang语言项目开发中,由于Golang语言是强类型,所以经常会用到类型转换。本文介绍类型转换的三方库——github.com/spf13/cast,这是一个极简类型转换的三方库。它提供的功能可以方便我们进行类型转换,大大提高我们的开发效率。而且,cast会根据一定的规则自动进行正确的操作。例如,当我们使用cast.ToInt()将字符串转换为整数时,只有当参数为int字符串时,如"4",才会将参数转换为整数,否则为整数零价值。实际上,当我们需要在各种整数和浮点数类型之间进行转换时,我们可以使用强制类型转换;在各种整数和字符串之间进行转换时,我们可以使用标准库strconv操作,但是使用方式不够优雅。而且,如果要转换的值是接口类型,需要先进行类型断言,然后再进行类型转换,显得比较复杂。cast可以简化这些工作,让我们的代码更加优雅。虽然cast使用起来比较简单,它提供了一些cast.ToXxx()和cast.ToXxxE()函数,我们还是通过一些简单的例子来介绍cast的用法,比如转换成string类型这种比较常用的。02转换为字符串类型我们可以使用cast.ToString()函数将给定的参数转换为字符串类型。如果给定的参数不能转换为字符串类型,它将返回一个类型零值(字符串类型零值-空字符串)。示例代码:a:=1fmt.Printf("val=%vtype=%T\n",cast.ToString(a),cast.ToString(a))b:=3.14fmt.Printf("val=%vtype=%T\n",cast.ToString(b),cast.ToString(b))c:="hello"fmt.Printf("val=%vtype=%T\n",cast.ToString(c),cast.ToString(c))d:=[]byte("golang")fmt.Printf("val=%vtype=%T\n",cast.ToString(d),cast.ToString(d))vareinterface{}="frank"fmt.Printf("val=%vtype=%T\n",cast.ToString(e),cast.ToString(e))f:=[]int{1,2,3}fmt.Printf("val=%vtype=%T\n",f,f)fmt.Printf("val=%vtype=%T\n",cast.ToString(nil),cast.ToString(nil))输出结果:val=1type=stringval=3.14type=stringval=hellotype=stringval=golangtype=stringval=franktype=stringval=type=string//值为空字符串val=type=string//值为空字符串阅读上面code,我们可以发现最后两行代码的输出结果都是空字符串,其实并不是这样的。我们可以使用cast.ToStringE()函数对参数f进行转换,然后查看返回结果。示例代码:v,err:=cast.ToStringE([]int{1,2,3})iferr!=nil{fmt.Println(err)return}fmt.Printf("val=%vtype=%T\n",v,v)输出结果:unabletocast[]int{1,2,3}oftype[]inttostring阅读上面的代码,我们可以发现同样的给定参数,使用不同的函数(cast.ToString()和cast.ToStringE()),返回结果不同。阅读cast的源码可以发现,cast.ToString()的底层实现是调用cast.ToStringE(),但是忽略了cast.ToStringE()返回的错误。源码:funcToString(iinterface{})string{v,_:=ToStringE(i)returnv}我们可以通过cast.ToxxxE()函数判断转换后得到的类型零值是否错误。03总结在本文中,我们介绍了最小类型转换的三方库强制转换,它可以大大提高我们的开发效率,让我们的代码更加优雅,帮助我们更轻松、更安全地进行类型转换。在本文中,我们通过使用cast.ToString()函数来简单介绍一下cast的使用。此外,它还支持许多其他类型。限于篇幅,我们不再一一赘述。建议有兴趣的读者朋友阅读官方文档或源码了解更多。参考资料:https://pkg.go.dev/github.com/spf13/cast@v1.4.1
