请教一个 Golang Go语言中的结构体问题

发布于 1周前 作者 songsunli 来自 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

12 回复

更多关于请教一个 Golang Go语言中的结构体问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题是你的 json 报文里的 item 也是一个内容为字符串的 json,这是个很差的设计,即使改不了,也至少在输入输出的地方统一处理,不要把脏东西带到你的业务代码里面去

嵌套有何不可?

你那个注释 // item 数据格式:{“f1”:[1,2,3], “f2”: [4,5,6]}
这个不对的吧,如果 item 是 string 的话,这个应该转义放在 item 里,像注释这样的话,item 就是 object,或者说是 struct 没错的啊……无论是 go 还是 php,反序列化的时候都不会只处理一部分的

请教下,这句什么意思: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语言中一种非常重要的复合数据类型,它允许你将多个不同类型的数据项组合成一个单一的类型。以下是一些关于结构体的基本要点和常见用法:

  1. 定义结构体: 使用type关键字定义结构体类型。例如:

    type Person struct {
        Name string
        Age  int
    }
    
  2. 创建结构体实例: 使用结构体类型创建变量。例如:

    p := Person{Name: "Alice", Age: 30}
    
  3. 访问和修改结构体字段: 通过点操作符访问和修改结构体字段。例如:

    fmt.Println(p.Name) // 输出: Alice
    p.Age = 31
    
  4. 嵌套结构体: 一个结构体可以包含其他结构体作为字段。例如:

    type Address struct {
        City, State string
    }
    type Employee struct {
        Person
        Address
    }
    
  5. 匿名字段和方法接收者: 匿名字段可以用于方法接收者,实现类似于面向对象编程中的继承。

  6. 标签(Tag): 结构体字段可以包含标签,通常用于JSON序列化/反序列化等。

如果你有更具体的问题,比如结构体嵌套、方法定义或标签的使用等,欢迎详细描述,我会提供更针对性的帮助。

回到顶部