在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是介面型別,非介...