gpt4 book ai didi

go - 在 Go 中解码为结构时的奇怪行为

转载 作者:IT王子 更新时间:2023-10-29 01:56:41 25 4
gpt4 key购买 nike

我正在开发一种工具,可以用来简化创建简单 CRUD 操作/端点的过程。由于我的端点不知道它们将接收哪种结构,因此我创建了一个用户可以实现的接口(interface),并返回一个要填​​充的空对象。

type ItemFactory interface {
GenerateEmptyItem() interface{}
}

用户会实现类似的东西:

type Test struct {
TestString string `json:"testString"`
TestInt int `json:"testInt"`
TestBool bool `json:"testBool"`
}

func (t Test) GenerateEmptyItem() interface{} {
return Test{}
}

当 Test 对象被创建时,它的类型是“Test”,即使 func 返回了一个接口(interface){}。然而,一旦我尝试将一些相同格式的 json 解码到其中,它就会剥离它的类型,并变成“map[string]interface {}”类型。

item := h.ItemFactory.GenerateEmptyItem()

//Prints "Test"
fmt.Printf("%T\n", item)

fmt.Println(reflect.TypeOf(item))

err := ConvertRequestBodyIntoObject(r, &item)
if err != nil {...}

//Prints "map[string]interface {}"
fmt.Printf("%T\n", item)

解码项目的函数:

func ConvertRequestBodyIntoObject(request *http.Request, object interface{}) error {
body, err := ioutil.ReadAll(request.Body)
if err != nil {
return err
}

// Unmarshal body into request object
err = json.Unmarshal(body, object)
if err != nil {
return err
}

return nil
}

关于为什么会发生这种情况,或者我该如何解决,有什么建议吗?

谢谢

最佳答案

您的问题缺少显示此行为的示例,所以我只是猜测这就是正在发生的事情。

func Generate() interface{} {
return Test{}
}

func GeneratePointer() interface{} {
return &Test{}
}

func main() {

vi := Generate()
json.Unmarshal([]byte(`{}`), &vi)
fmt.Printf("Generate Type: %T\n", vi)

vp := GeneratePointer()
json.Unmarshal([]byte(`{}`), vp)
fmt.Printf("GenerateP Type: %T\n", vp)
}

哪些输出:

Generate Type: map[string]interface {}
GenerateP Type: *main.Test

我建议您在 GenerateEmptyItem() 中返回一个指针,而不是在 GenerateP() 示例中演示的实际结构值。

Playground Example

关于go - 在 Go 中解码为结构时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53217910/

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