Go 類型轉換神器 cast 庫
什麼是 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 提供一致且簡單的方式在各種常見的類型之間進行轉換,能極大的提高開發效率。
**參考資料 **
-
https://github.com/spf13/cast
-
https://darjun.github.io/2020/01/20/godailylib/cast
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/aF3Rb2mXixus48xj6yunig