GO語(yǔ)言類型轉(zhuǎn)換和類型斷言實(shí)例分析
本文實(shí)例講述了GO語(yǔ)言類型轉(zhuǎn)換和類型斷言的用法。分享給大家供大家參考。具體分析如下:
由于Go語(yǔ)言不允許隱式類型轉(zhuǎn)換。而類型轉(zhuǎn)換和類型斷言的本質(zhì),就是把一個(gè)類型轉(zhuǎn)換到另一個(gè)類型。
一、類型轉(zhuǎn)換
(1)、語(yǔ)法:<結(jié)果類型> := <目標(biāo)類型> ( <表達(dá)式> )
(2)、類型轉(zhuǎn)換是用來(lái)在不同但相互兼容的類型之間的相互轉(zhuǎn)換的方式,所以,當(dāng)類型不兼容的時(shí)候,是無(wú)法轉(zhuǎn)換的。如下:
var var1 int = 7
fmt.Printf("%T->%v\n", var1, var1)
var2 := float32(var1)
var3 := int64(var1)
//var4 := []int8(var1)
//var5 := []string(var1)
fmt.Printf("%T->%v\n", var2, var2)
fmt.Printf("%T->%v\n", var3, var3)
//fmt.Printf("%T->%d", var4, var4)
//fmt.Printf("%T->%d", var5, var5)
}
其中,var4和var5處運(yùn)行會(huì)報(bào)錯(cuò)。因?yàn)轭愋筒患嫒荨W⑨尯?,輸出如下?br />
float32->7
int64->7
值得注意的是,如果某些類型可能引起誤會(huì),應(yīng)該用括號(hào)括起來(lái)轉(zhuǎn)換,如下:
//創(chuàng)建一個(gè)int變量,并獲得它的指針
var1 := new(int32)
fmt.Printf("%T->%v\n", var1, var1)
var2 := *int32(var1)
fmt.Printf("%T->%v\n", var2, var2)
}
*int32(var1)相當(dāng)于*(int32(var1)),一個(gè)指針,當(dāng)然不能直接轉(zhuǎn)換成一個(gè)int32類型,所以該表達(dá)式直接編譯錯(cuò)誤。將該表達(dá)式改為 (*int32)(var1)就可以正常輸出了。
二、類型斷言
(1)語(yǔ)法:
<目標(biāo)類型的值>,<布爾參數(shù)> := <表達(dá)式>.( 目標(biāo)類型 ) // 安全類型斷言
<目標(biāo)類型的值> := <表達(dá)式>.( 目標(biāo)類型 ) //非安全類型斷言
(2)類型斷言的本質(zhì),跟類型轉(zhuǎn)換類似,都是類型之間進(jìn)行轉(zhuǎn)換,不同之處在于,類型斷言實(shí)在接口之間進(jìn)行,相當(dāng)于Java中,對(duì)于一個(gè)對(duì)象,把一種接口的引用轉(zhuǎn)換成另一種。
我們先來(lái)看一個(gè)最簡(jiǎn)單的錯(cuò)誤的類型斷言:
var i interface{} = "kk"
j := i.(int)
fmt.Printf("%T->%d\n", j, j)
}
var i interface{} = "KK" 某種程度上相當(dāng)于java中的,Object i = "KK";
現(xiàn)在把這個(gè) i 轉(zhuǎn)換成 int 類型,系統(tǒng)內(nèi)部檢測(cè)到這種不匹配,就會(huì)調(diào)用內(nèi)置的panic()函數(shù),拋出一個(gè)異常。
改一下,把 i 的定義改為:var i interface{} = 99,就沒(méi)問(wèn)題了。輸出為:
以上是不安全的類型斷言。我們來(lái)看一下安全的類型斷言:
var i interface{} = "TT"
j, b := i.(int)
if b {
fmt.Printf("%T->%d\n", j, j)
} else {
fmt.Println("類型不匹配")
}
}
輸出“類型不匹配”。
希望本文所述對(duì)大家的GO語(yǔ)言程序設(shè)計(jì)有所幫助。
相關(guān)文章
golang微服務(wù)框架基礎(chǔ)Gin基本路由使用詳解
這篇文章主要為大家介紹了golang微服務(wù)框架Gin基本路由的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
Golang中interface轉(zhuǎn)string輸出打印方法
這篇文章主要給大家介紹了關(guān)于Golang中interface轉(zhuǎn)string輸出打印的相關(guān)資料,在go語(yǔ)言中interface轉(zhuǎn)string可以直接使用fmt提供的fmt函數(shù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
Go實(shí)現(xiàn)SSE消息推送的項(xiàng)目實(shí)戰(zhàn)
本文主要介紹了Go實(shí)現(xiàn)SSE消息推送的項(xiàng)目實(shí)戰(zhàn),結(jié)合JavaScript前端集成,構(gòu)建實(shí)時(shí)數(shù)據(jù)推送系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
如何在Go中使用Casbin進(jìn)行訪問(wèn)控制
這篇文章主要介紹了如何在Go中使用Casbin進(jìn)行訪問(wèn)控制,Casbin是一個(gè)強(qiáng)大的、高效的開(kāi)源訪問(wèn)控制框架,其權(quán)限管理機(jī)制支持多種訪問(wèn)控制模型,Casbin只負(fù)責(zé)訪問(wèn)控制2022-08-08
golang并發(fā)執(zhí)行的幾種方式小結(jié)
本文主要介紹了golang并發(fā)執(zhí)行的幾種方式小結(jié),主要包括了Channel,WaitGroup ,Context,使用這三種機(jī)制中的一種或者多種可以達(dá)到并發(fā)控制很好的效果,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
使用Go語(yǔ)言連接和操作數(shù)據(jù)庫(kù)的基本步驟
在Go語(yǔ)言中,連接和操作數(shù)據(jù)庫(kù)通常使用database/sql包,它提供了一個(gè)數(shù)據(jù)庫(kù)抽象層,支持多種數(shù)據(jù)庫(kù)引擎,如MySQL、PostgreSQL、SQLite等,下面我將以MySQL為例,詳細(xì)講解如何使用Go語(yǔ)言連接和操作數(shù)據(jù)庫(kù),需要的朋友可以參考下2024-06-06
Go語(yǔ)言O(shè)RM框架構(gòu)造查詢條件示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言O(shè)RM框架構(gòu)造查詢條件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Go語(yǔ)言實(shí)現(xiàn)的樹(shù)形結(jié)構(gòu)數(shù)據(jù)比較算法實(shí)例
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)的樹(shù)形結(jié)構(gòu)數(shù)據(jù)比較算法,實(shí)例分析了樹(shù)形結(jié)構(gòu)數(shù)據(jù)比較算法的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02

