首页 > 后端开发 > Golang > 正文

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

Patricia Arquette
发布: 2024-11-26 20:11:11
原创
126 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板