go語言型別斷言是啥
在go語言中,類型斷言是一個使用在介面值上的操作,用於檢查介面類型變數所持有的值是否實現了期望的介面或特定的類型,語法為「value, ok := x.(T)」。透過型別斷言可以做到的事:1、檢查i是否為nil;2、檢查i所儲存的值是否為某個型別。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
斷言是什麼?
斷言是程式設計術語,表示為一些布林表達。在編寫程式碼時,我們總是會做出一些假設,斷言就是用於在程式碼中捕捉這些假設。簡單的來理解斷言的話就是判斷的意思。所以在Go中類型斷言我們就可以理解成對類型的判斷。
類型斷言介紹
類型斷言(Type Assertion)是使用在介面值上的操作,用於檢查介面類型變數所持有的值是否實現了期望的介面或具體的類型。
在Go語言中類型斷言的語法格式如下:
value, ok := x.(T)
其中,x 表示一個介面的類型,T 表示一個特定的類型(也可為介面類型)。
此斷言表達式會傳回x 的值(也就是value)和一個布林值(也就是ok),可根據該布林值判斷x 是否為T 類型:
如果T 是具體某個類型,型別斷言會檢查x 的動態型別是否等於具體型別T。如果檢查成功,則類型斷言傳回的結果是 x 的動態值,其類型是 T。
如果 T 是介面類型,類型斷言會檢查 x 的動態類型是否滿足 T。如果檢查成功,x 的動態值不會被提取,回傳值是一個類型為 T 的介面值。
無論 T 是什麼類型,如果 x 是 nil 介面值,則類型斷言都會失敗。
在Go中型別斷言主要有兩種形式
#變數.(型別)
。例如:i.(int)變數,bool = 變數.(型別)
。例如:num,ok = i.(int)。 ok表示判斷類型是否成功的意思。
類型斷言的用法
#透過型別斷言可以做到以下幾件事
#檢查
i
是否為nil檢查
i
儲存的值是否為某個型別
具體的使用方式有兩種:
第一種:
t := i.(T)
這個表達式可以斷言一個介面物件(i)裡不是nil,且介面物件(i)儲存的值的類型是T,如果斷言成功,就會傳回值給t,如果斷言失敗,就會觸發panic。
來寫段程式碼試驗一下
package main import "fmt" func main() { var i interface{} = 10 t1 := i.(int) fmt.Println(t1) fmt.Println("=====分隔线=====") t2 := i.(string) fmt.Println(t2) }
運行後輸出如下,可以發現在執行第二次斷言的時候失敗了,並且觸發了panic
10 =====分隔线===== panic: interface conversion: interface {} is int, not string goroutine 1 [running]: main.main() E:/GoPlayer/src/main.go:12 +0x10e exit status 2
如果要斷言的介面值是nil,那我們來看看也是不是也如預期一樣會觸發panic
package main func main() { var i interface{} // nil var _ = i.(interface{}) }
#輸出如下,確實是會觸發panic
panic: interface conversion: interface is nil, not interface {} goroutine 1 [running]: main.main() E:/GoPlayer/src/main.go:5 +0x34 exit status 2
第二種
t, ok:= i.(T)
和上面一樣,這個表達式也是可以斷言一個介面物件(i)裡不是nil,並且介面物件(i)儲存的值的類型是T,如果斷言成功,就會返回其型別給t,且此時ok 的值為true,表示斷言成功。
如果介面值的類型,並不是我們所斷言的T,就會斷言失敗,但和第一種表達式不同的事,這個不會觸發panic,而是將ok 的值設為false ,表示斷言失敗,此時t 為T 的零值。
稍微修改下上面的例子,如下
package main import "fmt" func main() { var i interface{} = 10 t1, ok := i.(int) fmt.Printf("%d-%t\n", t1, ok) fmt.Println("=====分隔线1=====") t2, ok := i.(string) fmt.Printf("%s-%t\n", t2, ok) fmt.Println("=====分隔线2=====") var k interface{} // nil t3, ok := k.(interface{}) fmt.Println(t3, "-", ok) fmt.Println("=====分隔线3=====") k = 10 t4, ok := k.(interface{}) fmt.Printf("%d-%t\n", t4, ok) t5, ok := k.(int) fmt.Printf("%d-%t\n", t5, ok) }
運行後輸出如下,可以發現在執行第二次斷言的時候,雖然失敗了,但並沒有觸發了 panic。
10-true =====分隔线1===== -false =====分隔线2===== <nil> - false =====分隔线3===== 10-true 10-true
上面這段輸出,你要注意的是第二個斷言的輸出在-false
之前並不是有沒有輸出任何t2 的值,而是由於斷言失敗,所以t2 得到的是string 的零值也是""
,它是零長度的,所以你看不到其輸出。
Type Switch
如果需要區分多種類型,可以使用 type switch 斷言,這個將會比一個一個進行類型斷言更簡單、直接、更有效率。
package main import "fmt" func findType(i interface{}) { switch x := i.(type) { case int: fmt.Println(x, "is int") case string: fmt.Println(x, "is string") case nil: fmt.Println(x, "is nil") default: fmt.Println(x, "not type matched") } } func main() { findType(10) // int findType("hello") // string var k interface{} // nil findType(k) findType(10.23) //float64 }
輸出如下
10 is int hello is string <nil> is nil 10.23 not type matched
額外說明:
- #如果你的值是nil,那麼符合的是
case nil
- #如果你的值在switch-case 裡並沒有匹配對應的類型,那麼走的是default 分支
以上是go語言型別斷言是啥的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...

Go編程中的資源管理:Mysql和Redis的連接與釋放在學習Go編程過程中,如何正確管理資源,特別是與數據庫和緩存�...

使用Go語言連接Oracle數據庫時是否需要安裝Oracle客戶端?在使用Go語言開發時,連接Oracle數據庫是一個常見需求�...

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。
