日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Go 知识点(12) — 类型转换以三方库 cast

發布時間:2023/11/28 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go 知识点(12) — 类型转换以三方库 cast 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

類型轉換在編程語言中是很常見的操作,在 Go 語言中其類型轉換有下面一些注意點。

1. 整數類型之間的轉換

對于整數類型轉換,原則上目標類型的取值范圍要包含被轉換值,也就是說要轉換類型的值取值范圍要小于目標類型的取值范圍。

如果相反,即目標類型小,而要轉換的源值類型大,比如把值的類型從 int16 轉換為 int8 ,會出現截斷現象,如下代碼:

func main() {src := int16(-255)dst := int8(src)fmt.Println("dst is ", dst) // dst is  1
}

變量 src 的值是 int16 類型的 -255 ,而變量 dst 的值是由前者轉換而來的,類型是 int8int16 類型的可表示范圍可比 int8 類型大。

整數在計算機中都是以補碼的形式存儲的。其中:

  • 正數補碼和原碼相同;
  • 負數補碼是原碼各位求反再加 1;

比如,int16 類型的值 -255 的補碼是 1111111100000001

該值在轉換為 int8 類型的值,那么就會把在較高位置(或者說最左邊位置)上的 8 位二進制數直接截掉,從而得到 00000001 。又由于其最左邊一位是 0 ,表示它是個正整數,以及正整數的補碼就等于其原碼,所以 dst 的值就是 1 。

規則:

  1. 當整數值的類型的有效范圍由寬變窄時,只需在補碼形式下截掉一定數量的高位二進制數即可;
  2. 當浮點數類型的值轉換為整數類型值時,會把浮點數值的小數部分全部截掉;

2. 整數轉換字符串

把整數轉換為字符串,有兩種方法可以使用,分別是:

  • 使用 string 直接轉換;
  • 使用 strconv 庫方法進行轉換;

兩者的區別,可以看下面代碼:

func main() {a := 101s1 := string(a)s2 := strconv.Itoa(a)fmt.Printf("s1 is %#v, type is %T\n", s1, s1)fmt.Printf("s2 is %#v, type is %T\n", s2, s2)
}

輸出結果:

s1 is "e", type is string
s2 is "101", type is string

我們可以看到區別,

  • string 方法是將整數轉換為對應的 ASCII/Unicode 碼值;
  • strconv 庫的 Itoa 方法是將整數轉換成整數字面量對應的字符串;

如下代碼也是同樣的

func main() {a := 0x597Ds1 := string(a)s2 := strconv.Itoa(a)fmt.Printf("s1 is %#v, type is %T\n", s1, s1)fmt.Printf("s2 is %#v, type is %T\n", s2, s2)
}

輸出結果:

s1 is "好", type is string
s2 is "22909", type is string

16 進制數 0x597D 的十進制數字為 22909 ,且其 Unicode 值為漢字的

但需要關注的是,被轉換的整數值應該可以代表一個有效的 Unicode 代碼點,否則轉換的結果將會是 (僅由高亮的問號組成的字符串值)。

func main() {a := -2s1 := string(a)s2 := strconv.Itoa(a)fmt.Printf("s1 is %#v, type is %T\n", s1, s1)fmt.Printf("s2 is %#v, type is %T\n", s2, s2)
}

輸出結果為

s1 is "�", type is string
s2 is "-2", type is string

由于 -2 無法代表一個有效的 Unicode 值,所以得到的總會是

3. string類型與各切片類型之間轉換

一個值在從 string 類型向 []byte 類型轉換時,除了與 ASCII 編碼兼容的那部分字符集可以用單個字節表示之外,以 UTF-8 編碼的字符串會被拆分成零散、獨立的字節,單一字節是無法代表一個字符的。

func main() {a := "你好"s1 := string(a)s2 := []byte(a)s3 := []rune(a)fmt.Printf("s1 is %#v, type is %T\n", s1, s1)fmt.Printf("s2 is %#v, type is %T\n", s2, s2)fmt.Printf("s3 is %#v, type is %T\n", s3, s3)
}

輸出結果為:

s1 is "你好", type is string
s2 is []byte{0xe4, 0xbd, 0xa0, 0xe5, 0xa5, 0xbd}, type is []uint8
s3 is []int32{20320, 22909}, type is []int32

0xe4, 0xbd, 0xa0 合在一起才能代表字符 ,而 0xe5 , 0xa5 , 0xbd 合在一起才能代表符

一個值在從 string 類型向 []rune 類型轉換時代表著字符串會被拆分成一個個 Unicode 字符。

[]int32{20320, 22909} // 你好 

4. 類型轉換三方庫

第三方包 github.com/spf13/cast 專門解決類型轉換的問。這個包使用很簡單,主要有兩套函數:

  1. To_ 形式函數

這些函數始終返回所需的類型。如果無法正確轉換為對應的類型,則返回目標類型的零值。

支持的類型包括所有的基本數據類型,還支持 time.Timetime.Durationslicemap 等常用類型。

比如:

cast.ToString("mayonegg")         // "mayonegg"
cast.ToString(8)                  // "8"
cast.ToString(8.31)               // "8.31"
cast.ToString([]byte("one time")) // "one time"
cast.ToString(nil)                // ""
cast.ToTime("2021-08-10 22:00:00") // 2021-08-10 22:00:00 +0000 UTC

注意,轉換為 time.Time 時,需要注意時區問題。ToTime 默認使用 UTC,如果想用其他時區,得類似這么做:

secondsEastOfUTC := int((8 * time.Hour).Seconds())
beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)
fmt.Println(cast.ToTimeInDefaultLocation("2021-08-10 22:00:00", beijing))

當然,你也可以這樣:

fmt.Println(cast.ToTimeInDefaultLocation("2021-08-10 22:00:00", time.Local))

不過,Local 表示本地時區,要明確這個本地是不是你想要的。

  1. To_E 形式函數

E 表示 error,也就是說,這一系列函數會返回 error。在無法進行類型轉換時,會將錯誤原因返回。To_ 形式內部調用的是 To_E 形似,只是它忽略了錯誤。

這種形式就不舉例了。一般地,除非你需要區分零值是因為出錯導致的還是本身就是零值,否則應該使用 To_ 系列函數,畢竟更省事。

總結

以上是生活随笔為你收集整理的Go 知识点(12) — 类型转换以三方库 cast的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。