Я хочу создать простую функцию для проверки того, что маршалинг / демаршаллинг записи работает как задумано.Я просто использую JSON для этого примера:
package test
import (
"encoding/json"
"fmt"
"testing"
"reflect"
"github.com/stretchr/testify/require"
)
func CheckRoundTripJSON(t *testing.T, record interface{}) {
data, err := json.Marshal(record)
require.NoError(t, err)
fmt.Println("Record: ", record, " was encoded to: ", data, " - Type: ", reflect.TypeOf(record))
result := reflect.Zero(reflect.TypeOf(record))
inter := result.Interface()
fmt.Println("Result: ", reflect.TypeOf(result), ", Inter: ", reflect.TypeOf(inter))
{
err = json.Unmarshal(data, &result)
require.NoError(t, err)
fmt.Println(data, " was deserialized to ", result, "type: ", reflect.TypeOf(result))
require.Equal(t, record, result)
}
{
err = json.Unmarshal(data, &inter)
require.NoError(t, err)
fmt.Println(data, " was deserialized to ", inter, "type: ", reflect.TypeOf(inter))
require.Equal(t, record, inter)
}
}
type Person struct {
FirstName string
LastName string
Age uint8
}
func TestPersonMarshalling(t *testing.T) {
CheckRoundTripJSON(t, Person{
FirstName: "Leonard",
LastName: "Nimoy",
Age: 84,
})
}
В обоих блоках кода будет ошибка.Первый оставляет result
инициализированный по умолчанию, а второй заставляет inter
указывать на карту, содержащую десериализованные данные.
Мне было интересно, есть ли способ обеспечить этот интерфейс и функциональность в Голанге,Первоначально я пытался с result.Addr()
, но результат Zero
не адресуется, согласно документации.