golang 型別斷言的學習

2021-08-07 01:48:47 字數 2803 閱讀 3538

在php中有乙個 serialize() 函式 可以把陣列序列化成字串進行儲存和傳輸

如果想反序列化這種字串,在php中只需要乙個簡單的unserialize() 函式就可以完成了.但是在golang中可就沒有這麼容易了,非得費個九牛二虎之力,寫上不少**才行。

這時候只想感嘆一下,php真的是世界上最好的語言啊!

我就在今天的開發中遇到了這麼個問題,需要使用golang去解析php序列化的字串,在github上找了個解析的包,但是發現解析之後的結果是個inte***ce{}型別。

頓時我就無從下手了,總在想資料實際上是乙個map,但是解析後得到乙個inte***ce{} , 這讓我怎麼用啊

感覺需要用型別斷言,但又不太會用,遂去社群問一下吧,期望大佬們能給個答案。

實際上確實很管用。

下面貼一下**:

// 反序列化

decoder := php_serialize.newunserializer(str)

if result, err := decoder.decode(); err != nil else

// 斷言後,即可獲取內容

name := decodedata["name"]

age := decodedata["age"]

fmt.println(name, age)

// 內層資料仍需再次斷言

friends, ok := decodedata["friends"].(php_serialize.phparray)

if !ok

// 斷言成功後即可獲取內部資料

for _,v := range friends

friendname := friend["name"]

fmt.println(friendname)

} }}

可以粗暴的這麼理解:乙個變數是什麼型別,就進行什麼型別的斷言,斷言後,即可得到結果

怎麼判斷乙個變數的型別?

列印出來呀:fmt.printf("%t", verb)

%t這個佔位符可以顯示變數的型別

下面還有個示例:

// 反序列化

decoder := php_serialize.newunserializer(str)

result, err := decoder.decode()

if err != nil

// 型別斷言

t := result.(php_serialize.phparray)

strval := php_serialize.phpvaluestring(t["name"])

fmt.println(strval)

switch t := result.(type)

}}

上面兩個demo都可以達到效果,只是寫法不同。

後面我又經人介紹,得到了另外乙個包,也能達到效果:

這個包解析出來的所有結果的型別都是map[inte***ce{}]inte***ce{},所以做型別斷言的時候可以簡單粗暴一些

segmentfault:

stackoverflow:

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中的型別斷言

golang有型別轉換,型別斷言,型別切換 1.介面型別斷言 型別斷言就是將介面型別的值 x 裝換成型別 t 成功則返回 t 的例項。格式為 x.t 不安全,會造成panic,程式中斷 v x.t 不安全,會造成panic,程式中斷 v,ok x.t 推薦寫法型別斷言的必要條件就是x是介面型別,非介...