Вы говорите о типе переменной cons
, не так ли?
Фон
Если да, причина его типа interface{}
в том, что в PHP этовозможно сериализовать значение любого типа (от простого целого до сложного объекта), и, следовательно, любой код десериализации должен справиться с этим.Так как в Go так называемый «пустой интерфейс», interface{}
, удовлетворяется любым типом вообще (включая любой пользовательский тип, реализованный программистом), очень важно, чтобы декодер сериализованных данных PHP возвращал значение типаinterface{}
.
Решение
Убедившись, что декодирование прошло успешно, вам нужно либо type-assert получить результирующее значение нужного вам типа, либо использовать переключатель типа для отклонения обработки на основе конкретного типа значения, возвращаемого декодером.
Подход очень хорошо продемонстрирован пакетом, который вы используете в своем собственном наборе тестов .
Фрагмент, демонстрирующий основной подход
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
, а затем эта переменная проверяется далее.