首页  >  文章  >  后端开发  >  Go JSON 解组:结构与接口 – 何时使用指针?

Go JSON 解组:结构与接口 – 何时使用指针?

Patricia Arquette
Patricia Arquette原创
2024-11-26 20:11:11127浏览

Go JSON Unmarshalling: Structs vs. Interfaces – When to Use Pointers?

将 JSON 解组为结构体与接口

在 Go 中,encoding/json 包提供了将 JSON 数据与 Go 值相互转换的功能。将 JSON 解组为结构时,重要的是要了解包需要有关目标类型的显式指令。

默认情况下,将 JSON 解组为接口时,包会根据数据结构选择适当的类型。对于 JSON 对象,它选择 map[string]interface{},对于 JSON 数组,它选择 []interface{}。但是,在处理结构时,这种行为有所不同。

要将 JSON 解组为特定结构,您需要将指向该结构的指针作为 json.Unmarshal() 的第二个参数传递。这是因为 Go 在将指针传递给函数时会自动取消引用指针。

但是,如果您尝试将 JSON 解组到包含非指针结构体值的 interface{} 变量中,则包无法确定预期的值目标类型。相反,它会将数据解释为映射或切片,具体取决于其结构。

要解决此问题,您应该使用指针引用将结构体值包装在 interface{} 中。这确保 json.Unmarshal 具有解组为适当类型所需的信息:

func getFoo() interface{} {
    return &Foo{"bar"} // Use a pointer wrapper
}

这是示例代码的改进版本:

package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct {
    Bar string `json:"bar"`
}  

func getFoo() interface{} {
    return &Foo{"bar"}
}

func main() {

    fooInterface := getFoo() 

    myJSON := `{"bar":"This is the new value of bar"}`
    jsonBytes := []byte(myJSON)

    err := json.Unmarshal(jsonBytes, fooInterface )
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("%T %+v", fooInterface, fooInterface) 
}

此更新的代码将成功打印具有更新的“bar”值的未编组的 Foo 结构。

以上是Go JSON 解组:结构与接口 – 何时使用指针?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn