在使用Go编码过程中,大家一定遇到过类型转换的场景。今天就给大家介绍一个简单、易用且安全的类型转换工具:cast。以下是cast的基本档案:
cast包档案 | |||
---|---|---|---|
star |
2.5k |
used by |
74.1k |
contributors |
26 |
工具分类 |
效率 |
功能简介 |
在不同类型之间进行简单、安全的类型转换 |
应用场景:该包当初是专门为著名的web框架Hugo开发的。一般应用在将接口类型转换到一个具体的类型时,以及从YAML、JSON等若类型的配置文件中读取数据,并想转换到具体数据类型时应用。当然也可以将任意两个类型之间进行转换,比如把数值转换成字符串,将接口类型转换成布尔类型等。
基本使用:Cast库提供了如下格式的方法:ToXXXX()。该方法一定会返回特定类型的值。如果输入的参数值不能被转换成对应的类型,那么就会返回0或nil,也不会报错。
Cast库还提供了ToXXXXE()格式的方法。该方法和ToXXXX()方法唯一的区别是当出错时,会把具体的错误返回给调用者。
我们看下最基本的ToString和ToInt应用示例:
ToString:
cast.ToString("mayonegg") // "mayonegg"
cast.ToString(8) // "8"
cast.ToString(8.31) // "8.31"
cast.ToString([]byte("one time")) // "one time"
cast.ToString(nil) // ""
var foo interface{} = "one more time"
cast.ToString(foo) // "one more time"
ToInt:
cast.ToInt(8) // 8
cast.ToInt(8.31) // 8
cast.ToInt("8") // 8
cast.ToInt(true) // 1
cast.ToInt(false) // 0
var eight interface{} = 8
cast.ToInt(eight) // 8
cast.ToInt(nil) // 0
该包不仅有基础数据类型的转换,还有将一个类型转换成时间类型、map类型、boolean类型等多种功能。具体的可以详细参考该包的文档。
实现原理:该包的底层实现是基于类型判断实现的。通过类型判断选择出具体的类型,然后再根据相应的函数转换成对应的类型。比如,在该包中有ToString函数,如果是将float32类型转换成string类型,则底层依然是strconv.FormatFloat(s, 'f', -1, 64)函数来实现的。
另外,在Go中一种是类型断言,一种是类型判断。这两种的使用是有区别的。我们看下其区别。
-
类型断言
类型断言是用来断定某个接口是否是某个具体的数据类型,形式是interface.(T),T是特定的类型。如下:
a := 10
var c interface{} = a
cv, ok := c.(int)
fmt.Println(cv, ok) //10,true
这里需要注意的是 c 必须是接口类型。同时安全的形式是 cv, ok := c.(int)这种形式,而非cv := c.(int),否则在不是对应的类型时会报panic。如下:
cv := c.(string) //panic: interface conversion: interface {} is int, not string
-
类型判断
类型判断判断该接口是哪种具体的类型,其使用形式是 interface.(type),这里括号中是固定的type。如下:
switch s := c.(type) {
case string:
return s, nil
case bool:
return strconv.FormatBool(s), nil
case float64:
return strconv.FormatFloat(s, 'f', -1, 64), nil
case float32:
return strconv.FormatFloat(float64(s), 'f', -1, 32), nil
这里需要结合switch-case语句使用。如果能转换成对应的类型,则s是该类型的值。
更多项目详情请查看如下链接。
开源项目地址:https://github.com/spf13/cast
开源项目作者:spf13
标签:类型转换,cast,ToInt,类型,ToString,go,interface From: https://www.cnblogs.com/cheyunhua/p/16729607.html