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真的是世界上最好的語言...