【GoCN酷Go推薦】Go 類型轉換神器 cast庫
什么是 cast?
cast 用于一致且簡單的方式在不同的 go 類型之間進行安全的轉換。
為什么使用 cast?
在 Go 程序中,我們通常需要將數(shù)據(jù)由一種類型轉換為另一種類型。
cast 使用一致且簡單的方式來提供安全的類型轉換。它不僅僅適用于類型斷言,更強大的功能在于我們使用接口來處理動態(tài)數(shù)據(jù)的時候,cast 提供了一種簡單的方法將接口優(yōu)雅的轉換為我們需要的數(shù)據(jù)類型。
使用 cast 將會極大的增加我們的開發(fā)效率,因為它本身就是為了開源項目 Hugo 而生。
使用 Go 標準庫進行類型轉換的痛點
在實際開發(fā)中我們往往需要對一些常用的數(shù)據(jù)類型進行轉換,如 string,int,int64,float等數(shù)據(jù)類型。
標準庫 strconv 提供了字符串與基本數(shù)據(jù)類型之間的轉換功能,我們也可以使用fmt.Sprintf函數(shù)進行轉換。
但是往往使用起來不夠直觀,且當數(shù)據(jù)類型為接口時,若需要轉換成需要的數(shù)據(jù)類型較為繁瑣。
快速使用 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 實現(xiàn)了多種常見類型之間的相互轉換,并返回最符合直覺的結果。如:
nil 轉 string 的結果為 "" true 轉 string 的結果為 "true",true 轉 int 的結果為 1 interface{} 轉為其他類型,要看它里面存儲的值類型
這些類型包括了:
基本類型:整形,浮點型,布爾類型,字符串 空接口:interface{} nil 時間:time.Time 時間段:time.Duration 切片類型:[]Type map[string]Type
使用起來非常的絲滑。
進階使用
cast提供了兩組函數(shù):
toType,將參數(shù)轉換為 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 提供一致且簡單的方式在各種常見的類型之間進行轉換,能極大的提高開發(fā)效率。
參考資料
https://github.com/spf13/cast https://darjun.github.io/2020/01/20/godailylib/cast
還想了解更多嗎?
更多請查看:https://github.com/spf13/cast
歡迎加入我們GOLANG中國社區(qū):https://gocn.vip/
《酷Go推薦》招募:
各位Gopher同學,最近我們社區(qū)打算推出一個類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個庫或者好的項目,然后寫一點這個庫使用方法或者優(yōu)點之類的,這樣可以真正的幫助到大家能夠學習到新的庫,并且知道怎么用。
大概規(guī)則和每日新聞類似,如果報名人多的話每個人一個月輪到一次,歡迎大家報名!
點擊 閱讀原文 即刻報名
— 往期回顧 —
【GoCN酷Go推薦】Go程序配置利器-viper庫

【GoCN酷Go推薦】Validator 網(wǎng)絡請求數(shù)據(jù)驗證包

【GoCN酷Go推薦】ip2location 解析 IP 地址庫

