go - 在这个 JSON 解组示例中,golang 如何处理指针?
问题描述
为了反序列化 JSON,我发现我们需要传递一个输出地址来检索结果,但出于某种原因,我更喜欢传统方式检索结果。
这里是一个例子: https: //play.golang.org/p/3hN1iLrDPGv
package main
import (
"encoding/json"
"fmt"
"time"
)
type FruitBasket struct {
Name string
Fruit []string
Id int64 `json:"ref"`
private string // An unexported field is not encoded.
Created time.Time
}
type FruitBaskets []FruitBasket
func Deserialize(val interface{}) interface{} {
serialBytes := `[{"Name":"Standard2","Fruit":["Apple","Banana","Orange"],"ref":999,"private":"Second-rate","Created":"2021-08-13T11:55:12.541568+07:00"}]`
err := json.Unmarshal([]byte(serialBytes),&val)
if err != nil {
fmt.Printf("err: %s", err)
}
return val
}
func main() {
out1 := Deserialize(&FruitBaskets{})
// out2 := out1.(FruitBaskets) // I want this line
out2 := out1.(*FruitBaskets)
fmt.Println("Testing and got..",out2)
}
解决方案
标准库 JSON 编组器将始终需要一个指向要解组的结构的指针。如果您尝试传入一个不是指针的值,json.InvalidUnmarshalError
则将返回 a。
看来您正在尝试编写一个只返回一个值的方法。为此,您需要Deserialize()
为每种类型创建一个返回该特定类型的函数。例如:
func Deserialize(in []byte) (FruitBasket, error) {
fb := &FruitBasket{}
err := json.Unmarshal(in, &fb)
if err != nil {
fmt.Printf("err: %s", err)
return FruitBasket{}, err
}
return *fb, nil
}
一旦将泛型引入 Go,就可以编写一个适用于所有类型的函数。但在当前系统的限制下,这是不可能的。
推荐阅读
- javascript - 登录后如何更改 SPA 显示的内容
- apache-flink - 同一个 Apache Flink 项目中的多个作业
- python - 如何在 repl.it 上上传包含 3000 个文本文档的文件夹?
- javascript - 搜索输入正在取消文本作为 vuejs 中的一种类型
- azure-active-directory - Azure Active Directory:如果分配给管理单元,“用户管理员”不能删除用户
- python - 如何使用 ipyvuetify 的 Slider 对象中的插槽?
- firebase - Firebase 部署
- amazon-web-services - 关于 AWS Lambda 函数在触发警报后重复触发 SNS 函数
- electron - 如何在 Electron 中使用 Redux 开发工具?
- arrays - 将 product line_items 存储在与供应商的关联数组中