掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Go 語(yǔ)言是強(qiáng)類(lèi)型編程語(yǔ)言,一些使用弱類(lèi)型編程語(yǔ)言的讀者朋友們?cè)诔鯇W(xué) Go 語(yǔ)言時(shí),多多少少都會(huì)不太適應(yīng) Go 語(yǔ)言的類(lèi)型。

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)推出橋東免費(fèi)做網(wǎng)站回饋大家。
Go 語(yǔ)言變量類(lèi)型包含基礎(chǔ)類(lèi)型和復(fù)合類(lèi)型,類(lèi)型轉(zhuǎn)換和類(lèi)型斷言一般是對(duì)基礎(chǔ)類(lèi)型的處理,基礎(chǔ)類(lèi)型包含整數(shù)、浮點(diǎn)數(shù)、布爾和字符串。
其中整數(shù)類(lèi)型又稱為整型,分為有符合和無(wú)符號(hào),各自又包含不同大小,8位、16位、32位和64位,其中 int32 和 uint8 的類(lèi)型別名分別是 rune和 byte。
浮點(diǎn)數(shù)類(lèi)型分為 float32 和 float64,為了避免精度丟失,一般我們選擇使用 float64,float32 和 float64 之間可以直接轉(zhuǎn)換,整型和浮點(diǎn)數(shù)類(lèi)型之間也可以直接轉(zhuǎn)換,需要注意丟失精度的問(wèn)題。
布爾類(lèi)型的值只有兩個(gè),分別是 true 和 false,類(lèi)型零值為 false。需要注意的是它無(wú)法像弱類(lèi)型編程語(yǔ)言可以隱式轉(zhuǎn)換為 1 和 0。
字符串類(lèi)型是一組使用雙引號(hào)引起來(lái)的字節(jié)序列,它可以包含任意數(shù)據(jù)。需要注意的是它不可以改變,因?yàn)槎鄠€(gè)字符串可以共享同一塊內(nèi)存空間。
本文我們介紹 Go 語(yǔ)言的類(lèi)型轉(zhuǎn)換和類(lèi)型斷言。
我們?cè)陧?xiàng)目開(kāi)發(fā)時(shí),可能會(huì)遇到一些需要類(lèi)型轉(zhuǎn)換的場(chǎng)景,比如我們使用 Go 語(yǔ)言開(kāi)發(fā) Api 接口。
客戶端(調(diào)用方)在請(qǐng)求我們使用 Go 語(yǔ)言開(kāi)發(fā)的 Api 接口時(shí),雖然會(huì)按照我們預(yù)先協(xié)商的參數(shù)類(lèi)型,但是隨著項(xiàng)目的不斷迭代,可能以前定義的變量類(lèi)型需要修改。
因?yàn)?Go 語(yǔ)言是強(qiáng)類(lèi)型語(yǔ)言,不支持類(lèi)型隱式轉(zhuǎn)換,我們就需要顯式轉(zhuǎn)換變量的類(lèi)型。
Go 語(yǔ)言類(lèi)型轉(zhuǎn)換的方式:
整數(shù)類(lèi)型之間可以強(qiáng)制轉(zhuǎn)換,代碼如下:
func main(){
var a int64
a = 1
fmt.Printf("%T\t%d\n", a, a)
var b int8
b = int8(a)
fmt.Printf("%T\t%d\n", b, b)
}閱讀上面這段代碼,我們定義 int64 類(lèi)型的變量 a,使用 <類(lèi)型>(<數(shù)值>) 的格式,直接把變量 a 的由 int64 轉(zhuǎn)換為 int8 的變量 b。
浮點(diǎn)數(shù)類(lèi)型之間,浮點(diǎn)數(shù)和整型之間,也可以強(qiáng)制轉(zhuǎn)換,代碼如下:
func main(){
var a float64
a = 3.1415926
fmt.Printf("%T\t%f\n", a, a)
var b float32
b = float32(a)
fmt.Printf("%T\t%f\n", b, b)
var c int64
c = int64(b)
fmt.Printf("%T\t%d\n", c, c)
}閱讀上面這段代碼,我們定義 float64 類(lèi)型的變量 a,使用 <類(lèi)型>(<數(shù)值>) 的格式,直接把變量 a 由 float64 轉(zhuǎn)換為 float32 的變量 b,然后變量 b 由 float32 轉(zhuǎn)換為 int64 的變量 c。需要注意丟失精度的問(wèn)題。
布爾類(lèi)型 bool,它的值只有兩個(gè),分別是 true 和 false,它沒(méi)有其它類(lèi)型可以強(qiáng)制轉(zhuǎn)換,不過(guò)可以使用標(biāo)準(zhǔn)庫(kù)或三方庫(kù)對(duì)布爾類(lèi)型進(jìn)行類(lèi)型轉(zhuǎn)換。
字符串類(lèi)型是一組使用雙引號(hào)引起來(lái)的字節(jié)序列,所以 string 和 []byte 之間可以強(qiáng)制轉(zhuǎn)換,代碼如下:
func main(){
var a string
a = "golang"
fmt.Printf("%T\t%s\n", a, a)
var b []byte
b = []byte(a)
fmt.Printf("%T\t%d\n", b, b)
}閱讀上面這段代碼,我們定義 string 類(lèi)型的變量 a,使用 <類(lèi)型>(<數(shù)值>) 的格式,直接把變量 a 由 string 轉(zhuǎn)換為 []byte 的變量 b,反之亦然。
無(wú)法強(qiáng)制轉(zhuǎn)換的類(lèi)型,可以使用標(biāo)準(zhǔn)庫(kù)或三方庫(kù),比如布爾類(lèi)型,代碼如下:
func main(){
var a bool
a = true
fmt.Printf("%T\t%t\n", a, a)
var b string
b = strconv.FormatBool(a)
fmt.Printf("%T\t%s\n", b, b)
}閱讀上面這段代碼,我們定義 bool 類(lèi)型的變量 a,使用 <類(lèi)型>(<數(shù)值>) 的格式,使用標(biāo)準(zhǔn)庫(kù) strconv 的方法把變量 a 由 bool 轉(zhuǎn)換為 string 的變量 b。
除了標(biāo)準(zhǔn)庫(kù) strconv[1] 之外,標(biāo)準(zhǔn)庫(kù) fmt[2] 也提供了類(lèi)型轉(zhuǎn)換的方法;還有一些三方庫(kù),比如 cast[3]。限于篇幅,此處不再詳細(xì)贅述,感興趣的讀者朋友們可以閱讀相關(guān)文檔了解更多。
我們?cè)陧?xiàng)目開(kāi)發(fā)時(shí),可能想要定義參數(shù)的類(lèi)型為通用類(lèi)型,比如我們使用 Go 語(yǔ)言開(kāi)發(fā) Api 接口。
我們想要盡量適配客戶端(調(diào)用方)傳參使用不同類(lèi)型,比如調(diào)用方是使用弱類(lèi)型編程語(yǔ)言的場(chǎng)景。
我們可以定義變量類(lèi)型的空接口類(lèi)型 interface{},然后使用類(lèi)型斷言,獲取傳參的實(shí)際類(lèi)型,按需處理為我們想要的類(lèi)型。
示例代碼:
func main(){
var id interface{}
id = 1 // 參數(shù) id 接收到的值為整型
fmt.Printf("%T\t%v\n", id, id)
// 需要使用字符串類(lèi)型的變量 id 賦值給字符串類(lèi)型的變量 uid
var uid string
value, ok := id.(string)
if ok {
uid = value
}
fmt.Printf("%T\t%v\n", uid, uid)
}閱讀上面這段代碼,我們定義 interface{} 空接口類(lèi)型的變量 id,作為接收請(qǐng)求參數(shù),實(shí)際需要使用字符串類(lèi)型的數(shù)據(jù),我們使用類(lèi)型斷言檢查變量 id 的值是否是字符串類(lèi)型,是字符串類(lèi)型則賦值給變量 uid。
需要注意的是,我們?cè)谑褂妙?lèi)型斷言時(shí),最好使用 ok-idiom 模式,避免引發(fā) panic。
此外,還有 switch case 方式的類(lèi)型斷言,也稱為類(lèi)型選擇??梢蕴幚矶喾N類(lèi)型,代碼如下:
func main() {
var id interface{}
id = 1 // 參數(shù) id 接收到的值為整型
fmt.Printf("0-%T\t%v\n", id, id)
// 需要使用字符串類(lèi)型的變量 id 賦值給字符串類(lèi)型的變量 uid
var uid string
switch val := id.(type) {
case string:
uid = val
fmt.Printf("1-%T\t%v\n", uid, uid)
case int:
uid = strconv.Itoa(val)
fmt.Printf("2-%T\t%v\n", uid, uid)
default:
fmt.Printf("3-%T\t%v\n", uid, uid)
}
}閱讀上面這段代碼,我們使用 switch case 方式的類(lèi)型斷言參數(shù) id,如果參數(shù)的值是我們需要的類(lèi)型,則直接使用,反之,則類(lèi)型轉(zhuǎn)換之后再使用。
細(xì)心的讀者朋友們可能發(fā)現(xiàn)該方式的類(lèi)型斷言格式有所不同,小括號(hào)中的數(shù)據(jù)類(lèi)型改為 type。
需要注意的是,使用 switch case 方式的類(lèi)型斷言,即便省略 default,也不會(huì)因?yàn)椴皇?nbsp;ok-idiom 模式的類(lèi)型斷言而引發(fā) panic。
本文我們介紹 Go 語(yǔ)言中讓之前一直使用弱類(lèi)型編程語(yǔ)言的讀者朋友們迷惑的類(lèi)型轉(zhuǎn)換和類(lèi)型斷言。
讀完本文,大家至少可以區(qū)分類(lèi)型轉(zhuǎn)換和類(lèi)型斷言的區(qū)別,和了解各自的使用場(chǎng)景。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流