Создайте функцию, которая тестирует маршаллинг / демаршаллинг из интерфейса - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу создать простую функцию для проверки того, что маршалинг / демаршаллинг записи работает как задумано.Я просто использую 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 не адресуется, согласно документации.

1 Ответ

0 голосов
/ 10 декабря 2018

Используйте refle.New , чтобы создать адресуемое значение.

data, err := json.Marshal(record)
require.NoError(t, err)
dst := reflect.New(reflect.TypeOf(record)) 
err = json.Unmarshal(data, dst.Interface())  // dst.Interface() is pointer to the value.
require.NoError(t, err)
require.Equal(t, record, dst.Elem().Interface()) // dst.Elem().Interface() is the value.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...