请教一个 Golang Go语言中的结构体问题
请教一个 Golang Go语言中的结构体问题
接触 go 不久,有如下结构体:
type User struct {
UID int `json:"uid"`
Item string `json:"item"` // item 数据格式:{"f1":[1,2,3], "f2": [4,5,6]}
// ...
}
其中 Item 的值是一串 json,代码中好多地方需要操作这个 Item,每次操作的时候需要将其反序列化成对象,操作完了在序列化然后赋值给 Item
为了防止重复的写序列化和反序列化这两部分代码,我给 User 这个结构体绑上了两个方法:
func (u *User) UnmarshalItem(){
// ...
}
func (u *User) MarshalItem(){
// ...
}
这样每次只需要user.UnmarshalItem()
或者user.MarshalItem()
即可
后来发现这样还是避免不了频繁的序列化和反序列化,于是就给 User 再加一个反序列化后的属性,这样就不用每次都要反序列化了
type User struct {
UID int `json:"uid"`
Item string `json:"item"`
ItemObject map[string][]int `json:"itemObject"`
// ...
}
大佬们还有更好的解决方案吗?
其实我想实现这样的效果:
我在 User struct 里定义的时候 Item 的类型就是 map[string][]int,我想要获得 Item 的 json 的时候只需要 user.Item.String 就能获得了(这样好像得把 Item 也定义成结构体,然后再在 Item 这个结构体力定义 String,然后嵌套才行是不是)
更多关于请教一个 Golang Go语言中的结构体问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
自定义一个类型,实现 json.Unmarshaler 接口
例子: https://play.golang.org/p/wuzKpNlHhf0
https://gist.github.com/reusee/8a13d522c281691258f4ed2d33d0b81b
更多关于请教一个 Golang Go语言中的结构体问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
问题是你的 json 报文里的 item 也是一个内容为字符串的 json,这是个很差的设计,即使改不了,也至少在输入输出的地方统一处理,不要把脏东西带到你的业务代码里面去
嵌套有何不可?
请教下,这句什么意思:var _ json.Unmarshaler = new(Item)
定义了一个“丢弃”的变量并赋值?
嗯,注释的不对,应该是一个字符串 {"f1":[1,2,3], "f2": [4,5,6]}
。这样的
这句用于保证 Item 实现了 json.Unmarshaler 接口。如果没实现,编译时就会报错,因为不能将 *Item 赋值到 json.Unmarshaler 类型的变量。变量名不重要,所以用 _
你的号是不是被降权了,你的回复在新消息提醒列表里不出现
不知道
直接操作 json 呢? gjson sjson
直接操作 json 也可以,不过这个库用的不太熟,感觉直接操作字符串没有操作对象保险
你好!很高兴能帮助你解决Go语言中的结构体问题。结构体是Go语言中一种非常重要的复合数据类型,它允许你将多个不同类型的数据项组合成一个单一的类型。以下是一些关于结构体的基本要点和常见用法:
-
定义结构体: 使用
type
关键字定义结构体类型。例如:type Person struct { Name string Age int }
-
创建结构体实例: 使用结构体类型创建变量。例如:
p := Person{Name: "Alice", Age: 30}
-
访问和修改结构体字段: 通过点操作符访问和修改结构体字段。例如:
fmt.Println(p.Name) // 输出: Alice p.Age = 31
-
嵌套结构体: 一个结构体可以包含其他结构体作为字段。例如:
type Address struct { City, State string } type Employee struct { Person Address }
-
匿名字段和方法接收者: 匿名字段可以用于方法接收者,实现类似于面向对象编程中的继承。
-
标签(Tag): 结构体字段可以包含标签,通常用于JSON序列化/反序列化等。
如果你有更具体的问题,比如结构体嵌套、方法定义或标签的使用等,欢迎详细描述,我会提供更针对性的帮助。