Golang Go语言中两个struct之间的值赋值问题

发布于 1周前 作者 sinazl 来自 Go语言

Golang Go语言中两个struct之间的值赋值问题


type Resp struct {
Code int
Result map[string]interface{}
}

type Info struct { Uid string PicInfo []Pic Tags Tag }

type Pic struct { PicName string PicSize int }

type Tag struct { TagType string TagName string }

用 Resp 把某个接口返回的数据加载 接口返回 json 例:

json
{
    "Code": 1,
    "Result": {
        "Userid": 123,
        "Pics": [
            {
                "PicName": "1.jpg",
                "PicSize": 111
            },
            {
                "PicName": "2.jpg",
                "PicSize": 222
            }
        ],
        "TagType": "TypeA",
        "TagName": "S"
    }
}
  • 如何把 json 的 Result 内外层的 TagType 的值赋给 Info.Tag.TagType,因为实际的字段太多,层级也不一样,所以不想每个单独赋值,有没有什么解决办法,比如 struct 的 tag ?

另外

  • Info 会去构造 Xml,所以标签名和结构不能变。
  • 还有比如要把 Userid -> Uid 名称不一样的问题

更多关于Golang Go语言中两个struct之间的值赋值问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复
  1. 如果要完整的赋值, 应该需要一个新的 struct 来对应到 json 的结构
    2. Userid -> Uid 名称不一样的问题 可以 tag 里面写 json 的 tag 即可
    3. 如果仅仅是获取 json 中的某些值可以考虑 gjson 直接取不用再解析到 struct, 或者直接 map[string]interface

更多关于Golang Go语言中两个struct之间的值赋值问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html



type Info struct {
Uid string
PicInfo []Pic
Tags Tag
}
修改为
type Info struct {
Uid string
PicInfo []Pic
Tag
}

并且使用 json tag 命名 json 字段名

interface{} 一把梭,直接扔进去

谢谢 ~
1. 如果新的 struct 对应 json 的话,如何把这个 新 struct 值赋值给 Info ?只能依靠依次赋值吗?

在Go语言中,两个struct之间的值赋值是一个常见的操作。值得注意的是,Go语言中的struct是值类型(value type),这意味着当你将一个struct变量赋值给另一个同类型的变量时,会进行值的拷贝。

具体来说,如果你有两个同类型的struct变量a和b,当你执行b = a时,a中的所有字段值都会被复制到b中。这是一个浅拷贝(shallow copy)的过程,即只复制了字段的值,如果字段本身是引用类型(如切片、映射、指针等),则复制的是引用的地址,而不是引用的数据本身。

如果struct中包含了大量的数据或者复杂的嵌套结构,值的拷贝可能会带来一定的性能开销。在这种情况下,可以考虑以下几种优化策略:

  1. 使用指针:将struct的字段定义为指针类型,这样赋值时只会复制指针的地址,而不是数据本身。但需要注意的是,这也会带来额外的内存管理开销和潜在的空指针解引用风险。

  2. 实现自定义的拷贝方法:为struct实现一个拷贝方法,该方法可以根据实际需求进行深拷贝(deep copy)或浅拷贝。

  3. 使用第三方库:Go社区中有一些第三方库提供了深拷贝的功能,如github.com/mitchellh/copystructure等,这些库可以简化深拷贝的实现过程。

总的来说,在Go语言中,struct之间的值赋值是一个灵活且强大的特性,但在使用时也需要根据具体场景进行性能考虑和优化。

回到顶部