成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言類型轉(zhuǎn)換的陷阱

開發(fā) 前端
本文我們介紹 Go 語言類型轉(zhuǎn)換的兩個庫,分別是標(biāo)準(zhǔn)庫 strconv? 和三方庫 cast?,其中 cast 更方便、更安全,但是也有陷阱,我們需要特別注意,避免在項(xiàng)目開發(fā)中掉進(jìn)陷阱。

01 介紹

Go 語言作為強(qiáng)類型語言,在使用 Golang 開發(fā)項(xiàng)目時,經(jīng)常會遇到類型轉(zhuǎn)換的場景,整型之間可以直接轉(zhuǎn)換,字節(jié)切片和字符串之間也可以直接轉(zhuǎn)換。

但是,如果整型和字符串之間做類型轉(zhuǎn)換,則需要使用 strconv 標(biāo)準(zhǔn)庫提供的函數(shù)。

02 標(biāo)準(zhǔn)庫 strconv 類型轉(zhuǎn)換

Go 語言標(biāo)準(zhǔn)庫 strconv[1] 提供了一些類型轉(zhuǎn)換的函數(shù),比如在項(xiàng)目開發(fā)中使用比較多的整型和字符串之間的類型轉(zhuǎn)換。

func main() {
 salary := 5000
 salaryStr := strconv.Itoa(salary)
 fmt.Printf("%T salary=%d\n", salary, salary)
 fmt.Printf("%T salaryStr=%s\n", salaryStr, salaryStr)

 age := "23"
 ageInt, err := strconv.Atoi(age)
 fmt.Printf("%T age=%s\n", age, age)
 fmt.Printf("%T ageInt=%d err=%v\n", ageInt, ageInt, err)
}

輸出結(jié)果:

int salary=5000
string salaryStr=5000
string age=23
int ageInt=23 err=<nil>

閱讀上面這段代碼,我們使用標(biāo)準(zhǔn)庫 strconv 將整型變量 salary 轉(zhuǎn)換為字符串類型變量 salaryStr;將字符串類型變量 age 轉(zhuǎn)換為整型變量 ageInt。

但是,讀者朋友們有沒有發(fā)現(xiàn)一個問題,我們使用標(biāo)準(zhǔn)庫 strconv 提供的函數(shù) Atoi 將字符串類型變量轉(zhuǎn)換為整型變量,得到的是 int 類型,如果我們需要得到一個 int8 類型的變量,我們需要繼續(xù)做類型轉(zhuǎn)換,例如:

age := "23"
ageInt, err := strconv.Atoi(age)
ageInt8 := int8(ageInt)

也就是說,如果我們需要將一個字符串類型的變量轉(zhuǎn)換為一個非 int 類型的整型變量,需要做二次轉(zhuǎn)換,在實(shí)際項(xiàng)目開發(fā)中,使用起來稍微繁瑣一些。

此外,使用標(biāo)準(zhǔn)庫 strconv 做類型轉(zhuǎn)換,除了在一些場景中稍微繁瑣之外,還有另外一個問題,我們先閱讀以下一段代碼。

func main() {
  phoneNumber := "138001380001380013800013800138000"
 phoneNumberInt, err := strconv.Atoi(phoneNumber)
 fmt.Printf("%T phoneNumber=%s\n", phoneNumber, phoneNumber)
 fmt.Printf("%T phoneNumberInt=%d err=%v\n", phoneNumberInt, phoneNumberInt, err)
}

輸出結(jié)果:

string phoneNumber=138001380001380013800013800138000
int phoneNumberInt=9223372036854775807 err=strconv.Atoi: parsing "138001380001380013800013800138000": value out of range

閱讀上面這段代碼輸出的錯誤信息 value out of range,也就是說如果我們需要轉(zhuǎn)換的值超出返回,Go 語言標(biāo)準(zhǔn)庫 strconv 提供的函數(shù) Atoi 會返回錯誤。

所以,在使用函數(shù) Atoi 時,我們要做好參數(shù)驗(yàn)證和錯誤處理。

有沒有使用更簡單的類型轉(zhuǎn)換庫,接下來,我們來看一下流行的三方庫 cast。

03 三方庫 cast 類型轉(zhuǎn)換

Go 類型轉(zhuǎn)換的三方庫 cast 是一個使用比較多的庫,我們使用 cast[2] 來處理 Part02 的類型轉(zhuǎn)換需求,代碼如下:

func main() {
  age2 := "23"
 age2Int8 := cast.ToInt8(age2)
 fmt.Printf("%T age2=%s\n", age2, age2)
 fmt.Printf("%T age2Int8=%d\n", age2Int8, age2Int8)

 phoneNumber2 := "138001380001380013800013800138000"
 phoneNumber2Int := cast.ToInt(phoneNumber2)
 fmt.Printf("%T phoneNumber2=%s\n", phoneNumber2, phoneNumber2)
 fmt.Printf("%T phoneNumber2Int=%d\n", phoneNumber2Int, phoneNumber2Int)
}

輸出結(jié)果:

string age2=23
int8 age2Int8=23
string phoneNumber2=138001380001380013800013800138000
int phoneNumber2Int=0

閱讀上面這段代碼,我們可以發(fā)現(xiàn),使用 cast 可以直接將字符串類型的變量轉(zhuǎn)換為我們需要的整型變量,使用起來不再感到繁瑣。

同時,需要注意的是,如果轉(zhuǎn)換失敗,將返回類型零值,字符串類型變量 phoneNumber2 在使用 cast 轉(zhuǎn)換為 int 類型的變量時,返回的結(jié)果就是 int 的類型零值。

使用 cast 比使用 strconv 更簡單,而且不需要處理錯誤。但是,cast 還有一個陷阱,我們需要特別注意一下,我們先閱讀以下一段代碼:

func main() {
  month := "07"
 monthInt8 := cast.ToInt8(month)
 fmt.Printf("%T month=%s\n", month, month)
 fmt.Printf("%T monthInt8=%d\n", monthInt8, monthInt8)

 month2 := "08"
 month2Int8 := cast.ToInt8(month2)
 fmt.Printf("%T month2=%s\n", month2, month2)
 fmt.Printf("%T month2Int8=%d\n", month2Int8, month2Int8)
}

輸出結(jié)果:

string month=07
int8 monthInt8=7
string month2=08
int8 month2Int8=0

閱讀上面這段代碼的輸出結(jié)果,我們可以發(fā)現(xiàn)使用 cast 將字符串類型 month 和 month2 轉(zhuǎn)換為整型時,字符串是以 "0" 開頭的月份,"07" 轉(zhuǎn)換后得到整型 7,而 "08" 轉(zhuǎn)換后得到整型 0。

我們再使用 strconv 轉(zhuǎn)換 "08",代碼如下:

func main() {
  month2 := "08"
 month2Int8 := cast.ToInt8(month2)
 fmt.Printf("%T month2=%s\n", month2, month2)
 fmt.Printf("%T month2Int8=%d\n", month2Int8, month2Int8)

 month2Int2, err := strconv.Atoi(month2)
 fmt.Printf("%T month2Int2=%d err=%v\n", month2Int2, month2Int2, err)
}

輸出結(jié)果:

int8 month2Int8=0
int month2Int2=8 err=<nil>

讀者朋友們從輸出結(jié)果可以看到,"08" 使用 strconv 轉(zhuǎn)換后得到整型 8,所以我們在轉(zhuǎn)換以一個或多個 "0" 開頭的字符串為整型時,字符串 "0" 后面的數(shù)值大于 7 將不能使用 cast 轉(zhuǎn)換,最好就是在轉(zhuǎn)換以一個或多個 "0" 開頭的字符串為整型時,比如 "08"、"009"、"00010" 等,使用 strconv 轉(zhuǎn)換,而不要使用 cast 轉(zhuǎn)換。

04 總結(jié)

本文我們介紹 Go 語言類型轉(zhuǎn)換的兩個庫,分別是標(biāo)準(zhǔn)庫 strconv 和三方庫 cast,其中 cast 更方便、更安全,但是也有陷阱,我們需要特別注意,避免在項(xiàng)目開發(fā)中掉進(jìn)陷阱。

責(zé)任編輯:武曉燕 來源: Golang語言開發(fā)棧
相關(guān)推薦

2021-07-08 23:53:44

Go語言拷貝

2023-07-16 23:43:05

Go語言模式

2023-07-03 00:44:26

Go語言MySQL

2024-04-26 00:01:00

Go語言類型

2024-01-07 23:11:16

defer?Go語言

2024-05-10 08:04:44

開發(fā)者Go語言

2023-10-29 16:18:26

Go接口

2021-10-03 22:18:14

Go語言整數(shù)

2012-12-11 09:16:07

Go

2021-03-10 10:00:31

Go語言strconv包類型轉(zhuǎn)換工具

2010-07-14 17:03:52

編程語言

2023-12-04 18:31:59

C語言函數(shù)

2012-10-08 09:25:59

GoGo語言開發(fā)語言

2024-06-12 08:54:49

Go切片參數(shù)

2025-06-04 02:15:55

Go語言Slice

2018-03-12 22:13:46

GO語言編程軟件

2021-11-14 23:05:28

GoCast語言

2011-07-14 10:23:33

C語言

2024-06-11 08:30:31

2023-12-30 10:22:57

Go語言函數(shù)開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: www成人免费 | 99热国产免费 | 一区日韩 | 99久久影院| 久久不射电影网 | 99免费在线视频 | 免费在线黄色av | 成人精品一区二区户外勾搭野战 | 亚洲国产精品一区二区三区 | 白浆在线 | 国产精品一区在线观看你懂的 | 欧美6一10sex性hd | 黑人中文字幕一区二区三区 | 亚洲导航深夜福利涩涩屋 | 91精品久久久久久久久99蜜臂 | 91看片| 久草色视频 | 亚洲精品亚洲人成人网 | 中文av在线播放 | 亚洲成人免费av | 久久久久久久久久久久久9999 | 亚洲综合大片69999 | 国产精品日韩欧美一区二区 | 亚洲精品自拍视频 | 羞羞在线视频 | 国产视频一区二区 | 黄色毛片在线播放 | 日韩资源 | 久草免费在线视频 | 国产精品欧美一区二区三区 | 九九热最新地址 | 国产在线www | 国产综合精品 | 久久婷婷国产麻豆91 | 美女天堂| 成人国产免费观看 | 亚洲在线久久 | www.婷婷亚洲基地 | 91麻豆精品一区二区三区 | 国产欧美日韩一区二区三区在线观看 | 国产精品视频久久 |