Golang 類型轉(zhuǎn)換的實(shí)現(xiàn)(斷言、強(qiáng)制、顯式類型)
將一個(gè)值從一種類型轉(zhuǎn)換到另一種類型,便發(fā)生了類型轉(zhuǎn)換。靜態(tài)語(yǔ)言如c/c++,Java提供了隱性的類型轉(zhuǎn)換,但對(duì)于golang這種強(qiáng)類型系統(tǒng)則不一樣,golang并不支持自動(dòng)類型轉(zhuǎn)換或者隱性類型轉(zhuǎn)換。
在go可以分為斷言、強(qiáng)制、顯式類型轉(zhuǎn)換。
通常說的類型轉(zhuǎn)換是指斷言,強(qiáng)制一般不會(huì)用到,顯式是基本的類型轉(zhuǎn)換
斷言
斷言通過判斷接口x是否不是nil且為T類型
var s = x.(T)
具體而言,在T不為接口時(shí),要求x的動(dòng)態(tài)類型就是T,并且T必須實(shí)現(xiàn)了x接口;否則類型斷言無效,因?yàn)閤不可能儲(chǔ)存類型T的值
動(dòng)態(tài)類型:接口類型可以包含對(duì)實(shí)現(xiàn)接口的任何類型的實(shí)例的引用(接口具有所謂的動(dòng)態(tài)類型)
type I interface{ F() } type S struct{} func (S) F() { } type T struct{} func (T) F() { } // 此時(shí)靜態(tài)類型為接口I var x I // 此時(shí)動(dòng)態(tài)類型為結(jié)構(gòu)體S x = S{} // 重賦予x動(dòng)態(tài)類型為結(jié)構(gòu)體T x = T{}
在T為接口時(shí),x必須實(shí)現(xiàn)接口T
斷言失敗會(huì)觸發(fā)panic,當(dāng)然也可以s,ok:=x.(T)
,使用ok表示是否成功。
// 接口x轉(zhuǎn)換為非接口類型 var x interface{} = 1 y:=x.(int) // 接口x轉(zhuǎn)換為接口類型 type TypeAssertA interface { typeAssertA() } type TypeAssertB interface { typeAssertB() } type ta struct {} func (t ta) typeAssertA() {} func (t ta) typeAssertB() {} // ta結(jié)構(gòu)既實(shí)現(xiàn)了TypeAssertA又實(shí)現(xiàn)TypeAssertB,因此可以在兩種接口類型之間相互轉(zhuǎn)換 var x TypeAssertA = ta{} y:=x.(TypeAssertB)
switch斷言
switch判斷具體值類型,而在case中匹配具體類型。也可以i:=x.(type)
直接得到匹配類型的值
強(qiáng)制
通過unsafe等進(jìn)行強(qiáng)制類型轉(zhuǎn)換
比如將floag64類型轉(zhuǎn)換為uint64類型,可能值表現(xiàn)不同,但內(nèi)存二進(jìn)制儲(chǔ)存卻是一樣的
var f float64 u:= *(*uint64)(unsafe.Pointer(&f))
還可以用來進(jìn)行接口類型檢測(cè)
// 檢查contextImpl是否實(shí)現(xiàn)了context接口 var c Context=(*ContextImpl)(nil)
顯式
將一個(gè)類型表達(dá)式轉(zhuǎn)換為另一個(gè)
var s =T(x)
在碰到*
,<-
或者func
開頭的,最好使用括號(hào)以防止誤用
*Point(p) // same as *(Point(p)) (*Point)(p) // p is converted to *Point <-chan int(c) // same as <-(chan int(c)) (<-chan int)(c) // c is converted to <-chan int func()(x) // function signature func() x (func())(x) // x is converted to func() (func() int)(x) // x is converted to func() int func() int(x) // x is converted to func() int (unambiguous)
一個(gè)非常量x可以在以下情況下轉(zhuǎn)換為類型T
- x可以賦值為T
- 忽略struct標(biāo)簽,x類型與T具有相同的基礎(chǔ)類型
- 忽略 struct 標(biāo)記 x 的類型和 T 是未定義類型的指針類型,并且它們的指針基類型具有相同的基礎(chǔ)類型。
- x 的類型和 T 都是整數(shù)或浮點(diǎn)類型。
- x 的類型和 T 都是復(fù)數(shù)類型。
- x 的類型是整數(shù)或 [] byte 或 [] rune,并且 T 是字符串類型。
或者x 的類型是字符串,T 類型是 [] byte 或 [] rune。
注意可以賦值為指的是(V為x類型):
- V等于T
- V和T是具有相同元素類型的通道類型,V是雙向channel,且V或T中至少有一個(gè)不是以type命名的類型。
- T是接口類型,但不是類型參數(shù),x實(shí)現(xiàn)了T。
- x是預(yù)先聲明的標(biāo)識(shí)符nil, T是指針、函數(shù)、切片、映射、通道或接口類型,但不是類型參數(shù)。
- x是一個(gè)沒有類型的常量,可以用類型T的值表示。
此外,如果x的類型V或T是類型參數(shù),則在下列條件之一適用時(shí),x可賦值給類型T的變量:
- x是預(yù)先聲明的標(biāo)識(shí)符nil, T是一個(gè)類型參數(shù),x可以賦值給T的類型集中的每個(gè)類型。
- V不是一個(gè)命名類型,T是一個(gè)類型參數(shù),x可以賦值給T的類型集中的每個(gè)類型。
- V是一個(gè)類型參數(shù),T不是一個(gè)命名類型,V的類型集中的每個(gè)類型的值都可以賦值給T。
Ref
- https://learnku.com/articles/42797
- https://golang.google.cn/ref/spec#Type_assertions
- https://www.digitalocean.com/community/tutorials/how-to-convert-data-types-in-go
- https://golang.org/ref/spec#Conversions
- https://stackoverflow.com/questions/33337403/what-does-dynamic-type-mean-in-a-go-interface
- https://go.dev/ref/spec#Assignability
到此這篇關(guān)于Golang 類型轉(zhuǎn)換的實(shí)現(xiàn)(斷言、強(qiáng)制、顯式類型)的文章就介紹到這了,更多相關(guān)Golang 類型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- go強(qiáng)制類型轉(zhuǎn)換type(a)以及范圍引起的數(shù)據(jù)差異
- 一文帶你吃透Golang中的類型轉(zhuǎn)換
- 一文帶你了解Golang中類型轉(zhuǎn)換庫(kù)cast的使用
- 一文帶你了解Go語(yǔ)言中的類型斷言和類型轉(zhuǎn)換
- golang類型推斷與隱式類型轉(zhuǎn)換
- 詳解Go語(yǔ)言中的數(shù)據(jù)類型及類型轉(zhuǎn)換
- golang強(qiáng)制類型轉(zhuǎn)換和類型斷言
- 手把手帶你走進(jìn)Go語(yǔ)言之類型轉(zhuǎn)換
- Go 第三方庫(kù)之類型轉(zhuǎn)換問題
- Go語(yǔ)言類型轉(zhuǎn)換的方式有哪些
相關(guān)文章
Go語(yǔ)言之重要數(shù)組類型切片(slice)make,append函數(shù)解讀
這篇文章主要介紹了Go語(yǔ)言之重要數(shù)組類型切片(slice)make,append函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09golang如何用http.NewRequest創(chuàng)建get和post請(qǐng)求
這篇文章主要介紹了golang如何用http.NewRequest創(chuàng)建get和post請(qǐng)求問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Go語(yǔ)言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞詳解
這篇文章主要介紹了Go語(yǔ)言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03