go — перебрать карту, декодированную из формата PHP-сериализации

Как я могу читать условия несериализованные данные в Голанге в формате карты?

[map[19:map[conditions:map[0:map[operator:== value:AMW-1900-50SLE-ROOM
is_value_processed:false type:feedexport/rule_condition_product
attribute:sku] 1:map[type:feedexport/rule_condition_product
attribute:sku operator:== value:ASL-B654-77-74-98-ROOM
is_value_processed:false] 2:map[is_value_processed:false
type:feedexport/rule_condition_product attribute:sku operator:==
value:ASL-B217-57-54S-95-ROOM]] type:feedexport/rule_condition_combine
attribute:<nil> operator:<nil> value:1 is_value_processed:<nil>
aggregator:any]]]

Это код:

package main

import (
"fmt""github.com/wulijun/go-php-serialize/phpserialize")

func main() {
rules := RulesList()
for _, rule := range rules{
fmt.Println(rule.Conditions.(interface{}))
}
}

type Rule struct {
RuleId     int         `json:"rule_id"`
Conditions interface{} `json:"conditions"`
}

func RulesList() ([]Rule) {
db := DbConn()
res, err := db.Query(`SELECT r.rule_id, r.conditions_serialized AS
conditions FROM m_feedexport_rule AS r`)
CheckError(err)
rule  := Rule{}
rules := []Rule{}
for res.Next()  {
var ruleId int
var conditions string
err = res.Scan(&ruleId, &conditions)
CheckError(err)
cons, err := phpserialize.Decode(conditions)
CheckError(err)
rule.RuleId     = ruleId
rule.Conditions = cons
rules = append(rules, rule)
}
return rules
}

Результат в порядке, но мне нужно это в форме карты, теперь это интерфейс, который я не могу зациклить. В случае, если кто-то не понимает код, спросите меня.
Большое спасибо.

0

Решение

Вы говорите о типе переменной cons, ты?

Фон

Если да, то причина его типа interface{} потому что в PHP можно сериализовать значение любого типа (от простого целого до сложного объекта), и, следовательно, любой код десериализации должен справиться с этим. Так как в Go так называемый «пустой интерфейс», interface{},
удовлетворяется любым типом (в том числе любым пользовательским типом, реализованным программистом), для декодера сериализованных данных PHP очень удобно возвращать значение типа interface{},

Решение

Убедившись, что декодирование прошло успешно,
вам нужно либо типа утверждают
результирующее значение для типа вам нужно или использовать
переключатель типа
расходиться обработка на основе конкретного типа
значение, возвращаемое декодером.

Подход очень хорошо продемонстрирован
пакет, который вы используете в своем собственном тестирование.

Отрывок из него, демонстрирующий основной подход

if decodeRes, err = Decode(result); err != nil {
t.Errorf("decode data fail %v, %v", err, result)
return
}
decodeData, ok := decodeRes.(map[interface{}]interface{})
if !ok {
t.Errorf("decode data type error, expected: map[interface{}]interface{}, get: %T", decodeRes)
return
}
obj, _ := decodeData["object"].(*PhpObject)
if v, _ := obj.GetPrivateMemberValue("a"); v != int64(1) {
t.Errorf("object private value expected 1, get %v, %T", v, v)
}
if v := obj.GetClassName(); v != "A" {
t.Errorf("object class name expected A, get %v", v)
}

Вот, decodeRes это то, что возвращается декодером.
Это значение затем вводится типом, чтобы убедиться, что это конкретный тип
(также называемый «динамический» — что означает «во время выполнения»)
map[interface{}]interface{},

Обратите внимание, что используется так называемый тип с двумя аргументами assert
(это также называется «запятая идиома»), чтобы не сделать программу
паника во время выполнения, если конкретный тип отличается от
ожидаемый (всегда делайте это на данных, извлеченных извне!).

Значение утвержденного типа конкретного типа хранится в
decodeData переменная, а затем эта переменная проверяется дальше.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector