1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【GoCN酷Go推薦】Go 類型轉(zhuǎn)換神器 cast庫

        共 5641字,需瀏覽 12分鐘

         ·

        2021-04-12 10:40

        什么是 cast?

        cast 用于一致且簡單的方式在不同的 go 類型之間進行安全的轉(zhuǎn)換。

        為什么使用 cast? 

        在 Go 程序中,我們通常需要將數(shù)據(jù)由一種類型轉(zhuǎn)換為另一種類型。

        cast 使用一致且簡單的方式來提供安全的類型轉(zhuǎn)換。它不僅僅適用于類型斷言,更強大的功能在于我們使用接口來處理動態(tài)數(shù)據(jù)的時候,cast 提供了一種簡單的方法將接口優(yōu)雅的轉(zhuǎn)換為我們需要的數(shù)據(jù)類型。

        使用 cast 將會極大的增加我們的開發(fā)效率,因為它本身就是為了開源項目 Hugo 而生。

        使用 Go 標準庫進行類型轉(zhuǎn)換的痛點 

        在實際開發(fā)中我們往往需要對一些常用的數(shù)據(jù)類型進行轉(zhuǎn)換,如 string,int,int64,float等數(shù)據(jù)類型。

        標準庫 strconv 提供了字符串與基本數(shù)據(jù)類型之間的轉(zhuǎn)換功能,我們也可以使用fmt.Sprintf函數(shù)進行轉(zhuǎn)換。

        但是往往使用起來不夠直觀,且當數(shù)據(jù)類型為接口時,若需要轉(zhuǎn)換成需要的數(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)了多種常見類型之間的相互轉(zhuǎn)換,并返回最符合直覺的結(jié)果。如:

        • nil 轉(zhuǎn) string 的結(jié)果為 ""
        • true 轉(zhuǎn) string 的結(jié)果為 "true",true 轉(zhuǎn) int 的結(jié)果為 1
        • interface{} 轉(zhuǎn)為其他類型,要看它里面存儲的值類型

        這些類型包括了:

        • 基本類型:整形,浮點型,布爾類型,字符串
        • 空接口:interface{}
        • nil
        • 時間:time.Time
        • 時間段:time.Duration
        • 切片類型:[]Type
        • map[string]Type

        使用起來非常的絲滑。

        進階使用

        cast提供了兩組函數(shù):

        • toType,將參數(shù)轉(zhuǎn)換為 Type 類型。若轉(zhuǎn)換失敗,則返回 Type 類型的零值
        • ToTypeE,返回轉(zhuǎn)換后的值和 error

        時間和時間段的轉(zhuǎn)換

        代碼如下:

        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
        }

        轉(zhuǎn)換為切片

        代碼如下:

        package main

        import (
           "fmt"

           "github.com/spf13/cast"
        )

        func main() {
           sliceOfInt := []int{137}
           arrayOfInt := [3]int{812}
           // ToIntSlice
           cast.ToIntSlice(sliceOfInt)  // [1 3 7]
           cast.ToIntSlice(arrayOfInt)  // [8 12 0]

           sliceOfInterface := []interface{}{12.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]
        }

        轉(zhuǎn)為 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]
        }

        總結(jié) 

        cast 庫能在幾乎所有常見類型之間轉(zhuǎn)換,小巧但是非常的實用。

        cast 提供一致且簡單的方式在各種常見的類型之間進行轉(zhuǎn)換,能極大的提高開發(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)點之類的,這樣可以真正的幫助到大家能夠?qū)W習到新的庫,并且知道怎么用。


        大概規(guī)則和每日新聞類似,如果報名人多的話每個人一個月輪到一次,歡迎大家報名!


        點擊 閱讀原文 即刻報名


        — 往期回顧 —

        【GoCN酷Go推薦】Go程序配置利器-viper

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

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



        瀏覽 54
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            黄色91免费观看 | 豆花视频一区二区三区在线观看 | 黄色在线免费网址 | 天堂中文在线观看视频 | 免费看黄片视频 | 天天操性生活毛片 | 调教触手挤奶里番本子 | 丰满年轻岳乱妇免费观看 | 一道本久在线中文字幕 | 国产成人三级视频 |