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 實現了多種常見類型之間的相互轉換,並返回最符合直覺的結果。如:

這些類型包括了:

使用起來非常的絲滑。

進階使用

cast 提供了兩組函數:

時間和時間段的轉換

代碼如下:

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 提供一致且簡單的方式在各種常見的類型之間進行轉換,能極大的提高開發效率。

**參考資料 **

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/aF3Rb2mXixus48xj6yunig