婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang斷言判斷值類型的實現方法

Golang斷言判斷值類型的實現方法

熱門標簽:上海極信防封電銷卡價格 寧波語音外呼系統公司 宿遷便宜外呼系統代理商 鄭州智能語音電銷機器人價格 重慶慶云企業400電話到哪申請 湛江crm外呼系統排名 仙桃400電話辦理 地圖標注免費定制店 不封卡外呼系統

Golang可以通過斷言,判斷值的類型

s:="hello world"
i:=interface{}(s)//將數值轉化為interface空接口類型
//需要注意的是,必須是空接口類型才能使用斷言,如果不是空接口類型會報錯
//Invalid type assertion: a.(string) (non-interface type string on left)
v,e:=i.(string)//返回value和error值,當err值為true則轉化成功,value的值為括號中的值類型,當err值為false,則轉化不成功

也可以通過反射判斷值的類型

name:="test"
t:=relfect.TypeOf(name)
fmt.Println(t)//通過反射確定值的類型

類型斷言是什么,類型斷言和類型轉換有什么區別,這個問題以前我也常常分不清楚。為了幫助和我有一樣疑問的人,我決定得寫一篇關于這方面的博文,介紹一下golang中的類型斷言和類型轉換的區別,在JavaScript的超集Typescript里,也同樣有類型斷言的概念。這篇簡短的博文就是幫助大家解答這個疑問,我會盡量短的說清楚,我理解的類型轉換和類型斷言的區別是什么。

什么是類型轉換

類型轉換在很多靜態類型的語言中都會有的概念,類型轉換通常分為顯示類型轉換和隱式類型轉換。強制類型轉換形如:

f := 11.22
i := int(f)

例如有個float32的變量被賦值為11.22,現在我們想去掉小數部分,最簡單的方法就是將float32轉換為int32。

簡單來說,強制類型轉換就是你要從一個類型強制轉換到另一個類型。適用于一些基本類型,比如int, float之類等等。但在golang中,類型匹配是相當嚴格的,很多時候編譯器不會幫你去做,所以大多數的情況下,我們還是會做一些顯示的類型轉換。

比如這段看起來在其它靜態類型語言中毫無問題的代碼片段,在golang中編譯期就會報錯,golang會強制讓你做類型轉換。

var i int = 1
var f float64 = i

接下來看看隱式的類型轉換。golang中的隱式類型轉換主要存在于運行時。比如:

var w io.Writer = os.Stdout

這里將*File類型賦值給了io.Writer類型,在運行時會做一個隱式的類型轉換。

什么是斷言

在了解什么是類型斷言之前,先來了解一下斷言是什么

這是尼克楊嗎?

簡而言之,斷言就是對一種條件進行假設,如果這是尼克楊,那么我要要干嘛?如果這不是尼克楊又怎樣?
隨之,類型斷言就是對類型進行一種假設。

這里拿Typescript來說個事,在TS里我們很多時候會用到一種類型叫聯合類型,聯合類型A | B可以理解為它可以是A類型或者是B類型。實際例子:

let zhangsan:Student | null //表示zhangsan是一個Student或者null類型

我們需要使用zhangsan的時候,可以使用類型斷言

if(zhangsan) zs = Student>zhangsan
//或者
if(zhangsan) zs = zhangsan as Student

在golang中的類型斷言和Typescript中的第二種類型斷言比較相像。在golang中形如

x.(T)

x是一種接口類型,T可以是一種具體的類型也可以是一種接口類型

golang為什么需要類型斷言

為此,我們思考一個問題,為什么Golang需要類型斷言,golang中對類型的要求十分嚴格,而且golang中也沒有Typescript中的聯合類型,好像一切類型都是固定不變的,有了強制轉換類型,為什么還需要類型斷言呢?

在Golang中,接口類型是能夠隱式轉換的。看一個具體的例子:

var w io.Writer = os.Stdout

w的類型為io.Writer,但是它被賦值了*File,這是Golang幫助我們做了一次類型轉換。這次類型轉換是在運行時的,編譯時并不能確定下來。在運行時,這個接口值的類型被賦值為了*File,與此同時,值也被賦值為了os.Stdout。

上述說明了一個問題,接口值的類型是不固定的!因為它的類型是要在運行時才能確定下來,這需要看它的動態值的類型才能確定。這就是需要類型斷言的原因了。

再看一個具體的例子

var w io.Writer = os.Stdout

這條語句執行過后,w只會擁有write方法,但是原本的*File不止擁有write方法,應該還擁有read方法,同時,它也是io.ReadWriter接口的一個實例。如果這時候我們想使用read方法怎么辦,那就需要類型斷言了。

rw := w.(io.ReadWriter)

這里將w斷言為ReadWriter類型。斷言類型為一個接口。暴露了*File的read和write方法

類型斷言的檢查機制是怎樣的

于是我們想了解Golang的類型斷言的檢查機制是怎樣的,換句話說,Golang到底是如何來判斷斷言是否成功的。

首先明確的是x必須為一個接口類型,而T可以是一個具體的類型也可以是一個接口類型。下面我們分情況討論。

1.當T為一個接口類型時

當T為一個接口時,首先會判斷x的動態值是否符合T這個接口,如果符合的話,斷言成功,反之斷言失敗,斷言失敗時會拋出一個panic異常。但是如果類型斷言出現在一個預期有兩個結果的賦值操作中,那么斷言失敗不會拋出panic異常,而是用一個bool值標識是否斷言成功。

var w io.Writer = os.Stdout 
b, ok := w.(*bytes.Buffer) 

為了健壯性,我們應該對ok返回的結果進行處理。標識是否斷言成功。

var w io.Writer = os.Stdout 
if b, ok := w.(*bytes.Buffer);!ok {
  fmt.Fprintf(os.Stderr, "斷言失敗")
} else {
  //TODO
}

對一個接口類型的類型斷言改變了類型的表述方式,改變了可以獲取的方法集合(通常更大),但是它保護了接口值內部的動態類型和值的部分(Go Programing Language)

當T為一個具體類型時

當T為一個具體類型時,會先檢查x的動態值的類型是否為T,如果為T則斷言成功,如果不為T,則斷言失敗。

具體類型的類型斷言從它的操作對象中獲得具體的值(Go Programing Language)

當x為nil

最后再簡單的說一下x為nil的情況,當x為nil時,那么不論斷言類型是任何類型,都會斷言失敗

到此這篇關于Golang斷言判斷值類型的實現方法的文章就介紹到這了,更多相關Golang斷言判斷值類型內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 淺談golang類型斷言,失敗類型斷言返回值問題
  • golang之反射和斷言的具體使用

標簽:電子產品 物業服務 遼寧 西雙版納 青海 安康 儋州 海南

巨人網絡通訊聲明:本文標題《Golang斷言判斷值類型的實現方法》,本文關鍵詞  Golang,斷言,判斷,值,類型,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang斷言判斷值類型的實現方法》相關的同類信息!
  • 本頁收集關于Golang斷言判斷值類型的實現方法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 咸宁市| 仁化县| 杭州市| 温州市| 济阳县| 海淀区| 桃园县| 葫芦岛市| 南京市| 禄丰县| 柘荣县| 丽江市| 隆子县| 霍州市| 上杭县| 仙桃市| 郧西县| 房产| 旬阳县| 左贡县| 巴彦县| 馆陶县| 孝感市| 白城市| 柞水县| 麻阳| 高密市| 红河县| 昌都县| 浑源县| 灌云县| 铜山县| 钟山县| 临潭县| 乌兰浩特市| 荔浦县| 新郑市| 灌南县| 武威市| 京山县| 乐东|