gpt4 book ai didi

go - 创建一个函数来测试从接口(interface)编码/解码

转载 作者:数据小太阳 更新时间:2023-10-29 03:40:39 25 4
gpt4 key购买 nike

我想创建一个简单的函数来测试编码/解码记录是否按预期工作。我只是在这个例子中使用 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 指向包含反序列化数据的映射。

我想知道是否有办法在 Golang 中提供这种界面和功能。根据文档,我最初尝试使用 result.Addr()Zero 的结果不可寻址。

最佳答案

使用reflect.New创造一个可寻址的值(value)。

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.

关于go - 创建一个函数来测试从接口(interface)编码/解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53709480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com