<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【GoCN酷Go推薦】Go 類型轉換神器 cast庫

          共 5641字,需瀏覽 12分鐘

           ·

          2021-04-12 10:40

          什么是 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{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]
          }

          轉為 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 地址庫



          瀏覽 54
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲成人影音 | 超碰最新网址 | 水多多在线成人免费视频 | 影音先锋女人aV鲁色 | 精品乱伦网站 |