Go 類型轉換神器 cast庫
VSole2022-08-02 10:48:20
什么是 cast?
cast 用于一致且簡單的方式在不同的 go 類型之間進行安全的轉換。
為什么使用 cast?
在 Go 程序中,我們通常需要將數據由一種類型轉換為另一種類型。
cast 使用一致且簡單的方式來提供安全的類型轉換。它不僅僅適用于類型斷言,更強大的功能在于我們使用接口來處理動態數據的時候,cast 提供了一種簡單的方法將接口優雅的轉換為我們需要的數據類型。
使用 cast 將會極大的增加我們的開發效率,因為它本身就是為了開源項目 Hugo 而生。
使用 Go 標準庫進行類型轉換的痛點
在實際開發中我們往往需要對一些常用的數據類型進行轉換,如 string,int,int64,float等數據類型。
標準庫 strconv 提供了字符串與基本數據類型之間的轉換功能,我們也可以使用fmt.Sprintf函數進行轉換。
但是往往使用起來不夠直觀,且當數據類型為接口時,若需要轉換成需要的數據類型較為繁瑣。
快速使用 cast
安裝cast
go get github.com/spf13/cast
入門案例
cast.ToString("gocn") // "gocn"
cast.ToString(8) // "8"
cast.ToString(8.31) // "8.31"
cast.ToString([]byte("gocn")) // "gocn"
cast.ToString(nil) // ""
var foo interface{} = "I love gocn"
cast.ToString(foo) // "I love gocn"
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
cast 實現了多種常見類型之間的相互轉換,并返回最符合直覺的結果。如:
- nil 轉 string 的結果為 ""
- true 轉 string 的結果為 "true",true 轉 int 的結果為 1
- interface{} 轉為其他類型,要看它里面存儲的值類型
這些類型包括了:
- 基本類型:整形,浮點型,布爾類型,字符串
- 空接口:interface{}
- nil
- 時間:time.Time
- 時間段:time.Duration
- 切片類型:[]Type
- map[string]Type
使用起來非常的絲滑。
進階使用
cast提供了兩組函數:
- toType,將參數轉換為 Type 類型。若轉換失敗,則返回 Type 類型的零值
- ToTypeE,返回轉換后的值和 error
時間和時間段的轉換
代碼如下:
package main
import (
"time"
"github.com/spf13/cast"
)
func main() {
timeStamp := time.Now().Unix() //1617975806
cast.ToTime(timeStamp) //2021-04-09 21:43:26 +0800 CST
timeStr := "2021-04-09 21:43:26"
cast.ToTime(timeStr) //2021-04-09 21:43:26 +0000 UTC
duration, _ := time.ParseDuration("1m30s")
cast.ToDuration(duration) //1m30s
strDuration := "90s"
cast.ToDuration(strDuration) //1m30s
}
轉換為切片
代碼如下:
package main
import (
"fmt"
"github.com/spf13/cast"
)
func main() {
sliceOfInt := []int{1, 3, 7}
arrayOfInt := [3]int{8, 12}
// ToIntSlice
cast.ToIntSlice(sliceOfInt) // [1 3 7]
cast.ToIntSlice(arrayOfInt) // [8 12 0]
sliceOfInterface := []interface{}{1, 2.0, "gocn"}
sliceOfString := []string{"I", "love", "gocn"}
stringFields := " I love gocn "
any := interface{}(666)
// ToStringSliceE
cast.ToStringSlice(sliceOfInterface) // [1 2 gocn]
cast.ToStringSlice(sliceOfString) // [I love gocn]
cast.ToStringSlice(stringFields) // [I love gocn]
cast.ToStringSlice(any) // [666]
}
轉為 map[string]Type
代碼如下:
package main
import (
"github.com/spf13/cast"
)
func main() {
m := map[interface{}]interface{}{
"name": "gocn",
"age": 999,
}
cast.ToStringMapString(m) //map[age:999 name:gocn]
data := `{"name":"gocn", "url":"https://gocn.vip"}`
cast.ToStringMapString(data) //map[name:gocn url:https://gocn.vip]
}
總結
cast 庫能在幾乎所有常見類型之間轉換,小巧但是非常的實用。
cast 提供一致且簡單的方式在各種常見的類型之間進行轉換,能極大的提高開發效率。
VSole
網絡安全專家