我想在 GO 中決議一個多維陣列
目標是將陣列字串反序列化并進入回圈以獲取值。
在PHP中,我使用這個:
代碼:
<?php
$x='a:2:{i:0;a:6:{s:8:"category";i:0;s:3:"url";s:0:"";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:0:"";}}i:1;a:6:{s:8:"category";i:0;s:3:"url";s:3:"jjj";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:3:"jjj";}}}';
$x = unserialize($x);
//Print Array
print_r($x);
//Parse Array
foreach ($x as $key => $value){
//commandes
echo "category is :".$x[$key]["category"]."\n";
echo "path is :".$x[$key]["PARSED"]["path"]."\n";
}
輸出:
Array
(
[0] => Array
(
[category] => 0
[url] =>
[ruleid] => 0
[redirtype] => 0
[protocol] => 0
[PARSED] => Array
(
[path] =>
)
)
[1] => Array
(
[category] => 0
[url] => jjj
[ruleid] => 0
[redirtype] => 0
[protocol] => 0
[PARSED] => Array
(
[path] => jjj
)
)
)
category is :0
path is :
category is :0
path is :jjj
在GO中,我設法對字串進行反序列化,但我不知道如何像在 php 中那樣運行回圈
代碼:
package main
import (
"fmt"
"github.com/techoner/gophp/serialize"
)
func main() {
var line = []byte(`a:2:{i:0;a:6:{s:8:"category";i:0;s:3:"url";s:0:"";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:0:"";}}i:1;a:6:{s:8:"category";i:0;s:3:"url";s:3:"jjj";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:3:"jjj";}}}`)
out, _ := serialize.UnMarshal([]byte(line))
fmt.Println(out)
}
輸出:
[map[PARSED:map[path:<nil>] category:0 protocol:0 redirtype:0 ruleid:0 url:<nil>]
map[PARSED:map[path:jjj] category:0 protocol:0 redirtype:0 ruleid:0 url:jjj]]
任何人都可以幫忙嗎?
uj5u.com熱心網友回復:
在 Golang 中,你沒有任何未知陣列或物件的決議器,你的未知資料是介面,所以首先,你應該將資料轉換為陣列或物件,然后回圈遍歷它,下面的代碼會做你想做的。
func main() {
var line = []byte(`a:2:{i:0;a:6:{s:8:"category";i:0;s:3:"url";s:0:"";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:0:"";}}i:1;a:6:{s:8:"category";i:0;s:3:"url";s:3:"jjj";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:3:"jjj";}}}`)
out, _ := serialize.UnMarshal(line)
dataList := out.([]interface{})
for _, data := range dataList {
for k, v := range data.(map[string]interface{}) {
if k == "category" {
fmt.Printf("category is :%v\n", v)
} else if k == "PARSED" {
fmt.Printf("path is :%v\n", v.(map[string]interface{})["path"])
}
}
}
}
輸出:
path is :<nil>
category is :0
category is :0
path is :jjj
此外,這個包沒有任何轉換方法,json.Unmarshal所以你應該用你自己的資料知識來做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/468403.html
