iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >怎么在golang中实现两个结构体复制字段
  • 512
分享到

怎么在golang中实现两个结构体复制字段

2023-06-14 22:06:48 512人浏览 独家记忆
摘要

怎么在golang中实现两个结构体复制字段?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Golang的优点golang是一种编译语言,可以将代码编译为机器代码,

怎么在golang中实现两个结构体复制字段?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Golang的优点

golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的依赖,所以golang的性能优于其他的解释性语言,且可以在golang中使用goroutine来实现并发性,它提供了一个非常优雅的goroutine调度程序系统,可以很容易地生成数百万个goroutine。

package mainimport "fmt"import "reflect"// 用b的所有字段覆盖a的// 如果fields不为空, 表示用b的特定字段覆盖a的// a应该为结构体指针func CopyFields(a interface{}, b interface{}, fields ...string) (err error) {at := reflect.TypeOf(a)av := reflect.ValueOf(a)bt := reflect.TypeOf(b)bv := reflect.ValueOf(b)// 简单判断下if at.Kind() != reflect.Ptr {err = fmt.Errorf("a must be a struct pointer")return}av = reflect.ValueOf(av.Interface())// 要复制哪些字段_fields := make([]string, 0)if len(fields) > 0 {_fields = fields} else {for i := 0; i < bv.NumField(); i++ {_fields = append(_fields, bt.Field(i).Name)}}if len(_fields) == 0 {fmt.Println("no fields to copy")return}// 复制for i := 0; i < len(_fields); i++ {name := _fields[i]f := av.Elem().FieldByName(name)bValue := bv.FieldByName(name)// a中有同名的字段并且类型一致才复制if f.IsValid() && f.Kind() == bValue.Kind() {f.Set(bValue)} else {fmt.Printf("no such field or different kind, fieldName: %s\n", name)}}return}type S1 struct {    Name string    Age int}type S2 struct {    Name string    Age int32}func main() {    s1 := S1{"hello", 22}    s2 := S2{"world", 33}    fmt.Println(s1, s2)    CopyFields(&s1, s2)    fmt.Println(s1, s2)}

上述例子输出为:

{hello 22} {world 33}

no such field or different kind, fieldName: Age

{world 22} {world 33}

可见s2的Name字段值已经成功被覆盖.

而s2中Age字段和s1中Age字段类型不一样, 会忽略.

其实上面的还可以优化, 毕竟int32和int还是可以认为是"一样"的类型的,

不过思路就是这样.

补充:golang使用反射将一个结构体的数据直接复制到另一个结构体中(通过相同字段)

看代码吧~

package mainimport ("fmt""reflect")type A struct {Name   stringGender stringAge    int}type B struct {Name   stringGender string}//binding type interface 要修改的结构体//value type interace 有数据的结构体func structAssign(binding interface{}, value interface{}) {bVal := reflect.ValueOf(binding).Elem() //获取reflect.Type类型vVal := reflect.ValueOf(value).Elem()   //获取reflect.Type类型vTypeOfT := vVal.Type()for i := 0; i < vVal.NumField(); i++ {// 在要修改的结构体中查询有数据结构体中相同属性的字段,有则修改其值name := vTypeOfT.Field(i).Nameif ok := bVal.FieldByName(name).IsValid(); ok {bVal.FieldByName(name).Set(reflect.ValueOf(vVal.Field(i).Interface()))}}}func main() {as := A{}bs := B{Name: "wfy", Gender: "男"}fmt.Println(as)structAssign(&as, &bs)fmt.Println(as)}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网GO频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么在golang中实现两个结构体复制字段

本文链接: https://www.lsjlt.com/news/275301.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在golang中实现两个结构体复制字段
    怎么在golang中实现两个结构体复制字段?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。golang的优点golang是一种编译语言,可以将代码编译为机器代码,...
    99+
    2023-06-14
  • golang 实现两个结构体复制字段
    实际工作中可能会有这样的场景: 两个结构体(可能类型一样), 字段名和类型都一样, 想复制一个结构体的全部或者其中某几个字段的值到另一个(即merge操作), 自然想到可以用反射实现...
    99+
    2024-04-02
  • golang中按照结构体的某个字段排序实例代码
    目录概述从大到小排序按照结构体的某个字段排序使用 sort.Stable 进行稳定排序附:根据结构体中任意字段进行排序总结概述 golang的sort包默认支持int, float6...
    99+
    2024-04-02
  • Golang如何实现不被复制的结构体
    这篇文章主要介绍“Golang如何实现不被复制的结构体”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang如何实现不被复制的结构体”文章能帮助大家解决问题。不允许复制的结构体sync包中的许多...
    99+
    2023-07-05
  • golang中如何按照结构体的某个字段排序
    本文小编为大家详细介绍“golang中如何按照结构体的某个字段排序”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang中如何按照结构体的某个字段排序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概述gol...
    99+
    2023-06-30
  • Golang实现不被复制的结构体的方法
    目录不允许复制的结构体实现原理结论不允许复制的结构体 sync包中的许多结构都是不允许拷贝的,比如sync.Cond,sync.WaitGroup,sync.Pool, 以及sync...
    99+
    2023-05-14
    Golang不被复制结构体 Golang 复制结构体 Golang 结构体
  • 使用Golang反射实现结构体字段遍历与修改
    go 反射可以用于遍历和修改结构体字段。字段遍历:使用 reflect.typeof 和 reflect.field 遍历结构体字段。字段修改:通过 elem 和 set 来访问和修改结...
    99+
    2024-04-03
    java 关键词: php golang
  • Golang怎么实现Json转结构体
    这篇文章主要讲解了“Golang怎么实现Json转结构体”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang怎么实现Json转结构体”吧!请求Zabbix API,通过itemid获取...
    99+
    2023-07-05
  • 如何在另一个结构体中使用结构体字段而不将其引用为键
    在PHP的开发中,经常会遇到在一个结构体中使用另一个结构体字段的情况。然而,直接将其引用为键可能会造成代码的混乱和不易维护。那么如何在另一个结构体中使用结构体字段呢?php小编百草为大...
    99+
    2024-02-10
  • golang结构体序列化怎么实现
    在Go中,可以使用encoding/json包来实现结构体的序列化和反序列化。 首先,需要导入encoding/json包: imp...
    99+
    2023-10-22
    golang
  • sql怎么实现两个字段排序
    在SQL中,可以使用ORDER BY子句对查询结果进行排序。可以指定多个字段进行排序,例如:```sqlSELECT * F...
    99+
    2023-09-14
    sql
  • 怎么在c#中利用结构体实现共用体
    怎么在c#中利用结构体实现共用体?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。理解 C 语言的共用体在 C 语言中,共用体是一种特殊的数据类型,允许你使用相同的一段内存空间存储...
    99+
    2023-06-14
  • c++中怎么用memcpy复制结构体数组
    在C++中,可以使用memcpy函数来复制结构体数组。以下是一个示例代码: #include <iostream> #i...
    99+
    2024-03-05
    c++
  • Golang - 返回的 JSON 顶级字段是可变的。如何在结构体中使用
    问题内容 我有一个来自 API 的 JSON 响应,如下所示: { "1091500": { "data": { "price_overview":...
    99+
    2024-02-06
  • Golang怎么使用gob实现结构体的序列化
    本文小编为大家详细介绍“Golang怎么使用gob实现结构体的序列化”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么使用gob实现结构体的序列化”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Gol...
    99+
    2023-07-05
  • 实例分析:如何在Golang中实现高效的结构体强转
    对于一个Golang开发者来说,牢固扎实的基础是十分重要的,编程网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《实例分析:如何在Golang中实现高效的结构体强转》,主要介绍了,希望对大...
    99+
    2024-04-05
  • 怎么在Html中实现段落空两格
    本篇文章为大家展示了怎么在Html中实现段落空两格,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。打开HBuilder编辑工具,进入到编辑页面中,新建静态页面;利用类选择器设置div标签display...
    99+
    2023-06-15
  • sql中update多个字段怎么实现
    在 SQL 中,可以使用 UPDATE 语句来更新多个字段。更新多个字段时,可以在 SET 子句中指定多个字段及其对应的新值。例如:...
    99+
    2024-04-09
    sql
  • Go语言中怎么实现结构体反射
    本篇文章给大家分享的是有关Go语言中怎么实现结构体反射,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。结构体type Student struct ...
    99+
    2023-06-15
  • 怎么在golang中利用结构体嵌套的切片数组
    本篇文章为大家展示了怎么在golang中利用结构体嵌套的切片数组,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是golanggolang 是Google开发的一种静态强类型、编译型、并发型,并具...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作