最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang 類型轉(zhuǎn)換的實(shí)現(xiàn)(斷言、強(qiáng)制、顯式類型)

 更新時(shí)間:2023年09月03日 09:27:32   作者:動(dòng)態(tài)一時(shí)爽,重構(gòu)火葬場(chǎng)  
將一個(gè)值從一種類型轉(zhuǎn)換到另一種類型,便發(fā)生了類型轉(zhuǎn)換,在go可以分為斷言、強(qiáng)制、顯式類型轉(zhuǎn)換,本文就詳細(xì)的介紹一下這就幾種轉(zhuǎn)換方式,具有一定的參考價(jià)值,感興趣的可以了解一下

將一個(gè)值從一種類型轉(zhuǎn)換到另一種類型,便發(fā)生了類型轉(zhuǎn)換。靜態(tài)語言如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

 到此這篇關(guān)于Golang 類型轉(zhuǎn)換的實(shí)現(xiàn)(斷言、強(qiáng)制、顯式類型)的文章就介紹到這了,更多相關(guān)Golang 類型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go1.21中slog日志包用法入門

    go1.21中slog日志包用法入門

    go1.21中,slog這一被Go語言團(tuán)隊(duì)精心設(shè)計(jì)的結(jié)構(gòu)化日志包正式落地,本文將帶領(lǐng)讀者上手slog,體會(huì)其與傳統(tǒng)log的差異,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-09-09
  • golang基礎(chǔ)之waitgroup用法以及使用要點(diǎn)

    golang基礎(chǔ)之waitgroup用法以及使用要點(diǎn)

    WaitGroup是Golang并發(fā)的兩種方式之一,一個(gè)是Channel,另一個(gè)是WaitGroup,下面這篇文章主要給大家介紹了關(guān)于golang基礎(chǔ)之waitgroup用法以及使用要點(diǎn)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Go 通過結(jié)構(gòu)struct實(shí)現(xiàn)接口interface的問題

    Go 通過結(jié)構(gòu)struct實(shí)現(xiàn)接口interface的問題

    這篇文章主要介紹了Go 通過結(jié)構(gòu)struct實(shí)現(xiàn)接口interface的問題,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • Golang 斷言與閉包使用解析

    Golang 斷言與閉包使用解析

    這篇文章主要介紹了Golang 斷言與閉包使用解析,Go中的斷言用于判斷變量的類型,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • Golang?throttled基于GCRA速率限制庫使用探索

    Golang?throttled基于GCRA速率限制庫使用探索

    這篇文章主要為大家介紹了Golang?throttled基于GCRA速率限制庫使用實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go 語言數(shù)組和切片的區(qū)別詳解

    Go 語言數(shù)組和切片的區(qū)別詳解

    本文主要介紹了Go 語言數(shù)組和切片的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go語言通過反射實(shí)現(xiàn)獲取各種類型變量的值

    Go語言通過反射實(shí)現(xiàn)獲取各種類型變量的值

    反射是程序在運(yùn)行期間獲取變量的類型和值、或者執(zhí)行變量的方法的能力,這篇文章主要為大家講講Go語言通過反射獲取各種類型變量值的方法,需要的可以參考下
    2023-07-07
  • docker中部署golang項(xiàng)目的步驟詳解

    docker中部署golang項(xiàng)目的步驟詳解

    這篇文章主要給大家介紹了關(guān)于在docker中部署golang項(xiàng)目的步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Go標(biāo)準(zhǔn)庫http?server優(yōu)雅啟動(dòng)深入理解

    Go標(biāo)準(zhǔn)庫http?server優(yōu)雅啟動(dòng)深入理解

    這篇文章主要介紹了Go標(biāo)準(zhǔn)庫http?server優(yōu)雅啟動(dòng)深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go語言單元測(cè)試超詳細(xì)解析

    Go語言單元測(cè)試超詳細(xì)解析

    本文介紹了了Go語言單元測(cè)試超詳細(xì)解析,測(cè)試函數(shù)分為函數(shù)的基本測(cè)試、函數(shù)的組測(cè)試、函數(shù)的子測(cè)試,進(jìn)行基準(zhǔn)測(cè)試時(shí)往往是對(duì)函數(shù)的算法進(jìn)行測(cè)驗(yàn),有時(shí)后一個(gè)算法在測(cè)試數(shù)據(jù)的基量不同時(shí)測(cè)試出的效果會(huì)不同我們需要對(duì)不同數(shù)量級(jí)的樣本進(jìn)行測(cè)試,下文需要的朋友可以參考下
    2022-02-02

最新評(píng)論

额济纳旗| 延川县| 铜鼓县| 阿合奇县| 广安市| 佛坪县| 固镇县| 策勒县| 玉林市| 屏山县| 宁晋县| 青冈县| 定州市| 西城区| 丽水市| 龙山县| 广宁县| 江山市| 桦川县| 万盛区| 甘谷县| 昌平区| 赤峰市| 根河市| 罗城| 漠河县| 朝阳县| 巴林左旗| 安西县| 喀喇| 九龙城区| 喜德县| 商丘市| 乡城县| 鹤岗市| 绥阳县| 镇江市| 涞水县| 扶风县| 淄博市| 湄潭县|