日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
go語言類型斷言怎么使用

本篇內(nèi)容主要講解“go語言類型斷言怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“go語言類型斷言怎么使用”吧!

成都創(chuàng)新互聯(lián)公司自2013年起,先為廣河等服務(wù)建站,廣河等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為廣河企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

在go語言中,類型斷言是一個使用在接口值上的操作,用于檢查接口類型變量所持有的值是否實(shí)現(xiàn)了期望的接口或者具體的類型,語法為“value, ok := x.(T)”。通過類型斷言可以做到的事情:1、檢查i是否為nil;2、檢查i存儲的值是否為某個類型。

斷言是什么?

斷言是編程術(shù)語,表示為一些布爾表達(dá)。編寫代碼時,我們總是會做出一些假設(shè),斷言就是用于在代碼中捕捉這些假設(shè)。簡單的來理解斷言的話就是判斷的意思。所以在Go中類型斷言我們就可以理解成對類型的判斷。

類型斷言介紹

類型斷言(Type Assertion)是一個使用在接口值上的操作,用于檢查接口類型變量所持有的值是否實(shí)現(xiàn)了期望的接口或者具體的類型。

在Go語言中類型斷言的語法格式如下:

value, ok := x.(T)

其中,x 表示一個接口的類型,T 表示一個具體的類型(也可為接口類型)。

該斷言表達(dá)式會返回 x 的值(也就是 value)和一個布爾值(也就是 ok),可根據(jù)該布爾值判斷 x 是否為 T 類型:

  • 如果 T 是具體某個類型,類型斷言會檢查 x 的動態(tài)類型是否等于具體類型 T。如果檢查成功,類型斷言返回的結(jié)果是 x 的動態(tài)值,其類型是 T。

  • 如果 T 是接口類型,類型斷言會檢查 x 的動態(tài)類型是否滿足 T。如果檢查成功,x 的動態(tài)值不會被提取,返回值是一個類型為 T 的接口值。

  • 無論 T 是什么類型,如果 x 是 nil 接口值,類型斷言都會失敗。

在Go中類型斷言主要有兩種形式

  • 變量.(類型)。例如:i.(int)

  • 變量,bool = 變量.(類型)。例如:num,ok = i.(int)。ok表示判斷類型是否成功的意思。

類型斷言的用法

通過類型斷言可以做到以下幾件事情

  • 檢查 i 是否為 nil

  • 檢查 i 存儲的值是否為某個類型

具體的使用方式有兩種:

第一種:

t := i.(T)

這個表達(dá)式可以斷言一個接口對象(i)里不是 nil,并且接口對象(i)存儲的值的類型是 T,如果斷言成功,就會返回值給 t,如果斷言失敗,就會觸發(fā) panic。

來寫段代碼試驗(yàn)一下

package main

import "fmt"

func main() {
    var i interface{} = 10
    t1 := i.(int)
    fmt.Println(t1)

    fmt.Println("=====分隔線=====")

    t2 := i.(string)
    fmt.Println(t2)
}

運(yùn)行后輸出如下,可以發(fā)現(xiàn)在執(zhí)行第二次斷言的時候失敗了,并且觸發(fā)了 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,那我們來看看也是不是也如預(yù)期一樣會觸發(fā)panic

package main

func main() {
    var i interface{} // nil
    var _ = i.(interface{})
}

輸出如下,確實(shí)是會 觸發(fā) 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)

和上面一樣,這個表達(dá)式也是可以斷言一個接口對象(i)里不是 nil,并且接口對象(i)存儲的值的類型是 T,如果斷言成功,就會返回其類型給 t,并且此時 ok 的值 為 true,表示斷言成功。

如果接口值的類型,并不是我們所斷言的 T,就會斷言失敗,但和第一種表達(dá)式不同的事,這個不會觸發(fā) panic,而是將 ok 的值設(shè)為 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)
}

運(yùn)行后輸出如下,可以發(fā)現(xiàn)在執(zhí)行第二次斷言的時候,雖然失敗了,但并沒有觸發(fā)了 panic。

10-true
=====分隔線1=====
-false
=====分隔線2=====
 - false
=====分隔線3=====
10-true
10-true

上面這段輸出,你要注意的是第二個斷言的輸出在-false  之前并不是有沒有輸出任何 t2 的值,而是由于斷言失敗,所以 t2 得到的是 string 的零值也是 "" ,它是零長度的,所以你看不到其輸出。

Type Switch

如果需要區(qū)分多種類型,可以使用 type switch 斷言,這個將會比一個一個進(jìn)行類型斷言更簡單、直接、高效。

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
 is nil
10.23 not type matched

額外說明一下:

  • 如果你的值是 nil,那么匹配的是 case nil

  • 如果你的值在 switch-case 里并沒有匹配對應(yīng)的類型,那么走的是 default 分支

到此,相信大家對“go語言類型斷言怎么使用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


網(wǎng)頁題目:go語言類型斷言怎么使用
文章起源:http://www.dlmjj.cn/article/iiepso.html