文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-14 22:35

关注

怎么在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)}

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯