golang中的型別斷言

2021-10-25 21:36:42 字數 1940 閱讀 1043

golang有型別轉換,型別斷言,型別切換

1.介面型別斷言

型別斷言就是將介面型別的值(x),裝換成型別(t),成功則返回 t 的例項。格式為:

x.

(t)// 不安全,會造成panic,程式中斷

v := x.

(t)// 不安全,會造成panic,程式中斷

v, ok:

= x.

(t)// 推薦寫法

型別斷言的必要條件就是x是介面型別,非介面型別的x不能做型別斷言:

var i int=10

v:=i.

(int

)//錯誤 i不是介面型別,無法使用介面斷言

t可以是非介面型別,如果想斷言合法,則t應該實現x的介面

t也可以是介面,則x的動態型別也應該實現介面t

var x inte***ce=7

//x的動態型別為int,值為7

i:=x.

(int

)// i的型別為int ,值為7

type i inte***ce

var y i

s:=y.

(string

)//非法: string 沒有實現介面 i (missing method m)

r:=y.

(io.reader)

//y如果實現了介面io.reader和i的情況下, r的型別則為io.reader

型別斷言如果非法,執行時就會出現錯誤,為了避免這種錯誤,可以使用一下語法:

v,ok:=x.(t)

ok代表型別斷言是否合法,如果非法,ok則為false,這樣就不會出現panic了

在斷言的時候,值型別和對應的指標型別是兩個型別。

2.介面型別切換 type switch

型別切換用來比較型別而不是對值進行比較,type switch它用於檢測的是值x的型別t是否匹配某個型別.

格式如下,類似型別斷言,但是括號內的不是某個具體的型別,而是單詞type:

switch ins := x.

(type

)

ins 為對應型別的例項。

type switch語句中可以有乙個簡寫的變數宣告,這種情況下,等價於這個變數宣告在每個case clause 隱式**塊的開始位置。

如果case clause只列出了乙個型別,則變數的型別就是這個型別,否則就是原始值的型別。

假設下面的例子中的x的型別為x inte***ce{}:

switch i := x.

(type))

case

int:

printint

(i)// i的型別 int

case

float64

:printfloat64

(i)// i的型別是 float64

case

func

(int

)float64

:printfunction

(i)// i的型別是 func(int) float64

case

bool

,string

:printstring

("type is bool or string"

)// i的型別是 x (inte***ce{})

default

:printstring

("don't know the type"

)// i的型別是 x的型別 (inte***ce{})

}

也許你已經看到上面的例子中有乙個case clause中的型別是nil,它用來匹配x為nil的inte***ce{}的情況。

golang 型別斷言

型別斷言是乙個使用在介面值上的操作 有時候,我們可能需要知道某個介面型別的實際型別,比如某個方法需要接收多種型別的資料並需做分別處理時,我們可以把形參設為空介面型別以接收任意型別的值,但是我們怎麼反向知道裡面實際儲存了的是哪個型別的物件呢?一種常用的方法是 comma ok 斷言 value,ok ...

Golang 型別斷言

需要的知識 inte ce x.t 檢查x的動態型別是否是t,其中x必須是介面值。直接使用 func main x 100 value1,ok x.int if ok value2,ok x.string if ok 需要注意如果不接收第二個引數也就是ok,這裡失敗的話則會直接panic,這裡還存在...

golang 型別斷言的學習

在php中有乙個 serialize 函式 可以把陣列序列化成字串進行儲存和傳輸 如果想反序列化這種字串,在php中只需要乙個簡單的unserialize 函式就可以完成了.但是在golang中可就沒有這麼容易了,非得費個九牛二虎之力,寫上不少 才行。這時候只想感嘆一下,php真的是世界上最好的語言...