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

  介绍

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

golang的优点

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

package 主要   import “fmt"   import “reflect"//,用b的所有字段覆盖的//,如果字段不为空,,表示用b的特定字段覆盖的//,应该为结构体指针   func  CopyFields (a 界面{},,b 界面{},,fields ……字符串),(err 错误),{   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")   返回   }   时间=av  reflect.ValueOf (av.Interface ())//,要复制哪些字段   _fields :=,([]字符串,,0)   if  len(字段),祝辞,0,{   时间=_fields 字段   },{else    for 小姐::=,0;,小姐:& lt;, bv.NumField();,我+ +,{   时间=_fields 附加(_fields, bt.Field (i) . name)   }   }   if  len (_fields),==, 0, {   fmt.Println (“no  fields 用copy")   返回   }//,复制   for 小姐::=,0;,小姐:& lt;, len (_fields);,我+ +,{   name :=, _fields[我]   f :=, av.Elem () .FieldByName(名字)   bValue :=, bv.FieldByName(名字)//,中有同名的字段并且类型一致才复制   if  f.IsValid (),,,, f.Kind (),==, bValue.Kind (), {   f.Set (bValue)   },{else    fmt.Printf (“no  such  field 或是different ,,字段名:,% s \ n",,名字)   }   }   返回   }   type  S1  struct  {   ,,,Name 字符串   ,,,Age  int   }   type  S2  struct  {   ,,,Name 字符串   ,,,Age  int32   }   func  main (), {   ,,,s1 :=, S1 {“hello", 22}   ,,,s2 :=, S2 {“world",, 33}   ,,,fmt.Println (s1, s2)   ,,,CopyFields(及s1, s2)   ,,,fmt.Println (s1, s2)   }

上述例子输出为:

{你好22}{世界33}

没有这样的领域或不同,字段名:年龄

{世界22}{世界33}

可见s2的名字字段值已经成功被覆盖。

而s2中年龄字段和s1中年龄字段类型不一样,会忽略。

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

不过思路就是这样。

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

看代码吧~

package 主要   import  (   “fmt"   “reflect"   )   type  A  struct  {   Name ,字符串   Gender 字符串   Age ,, int   }   type  B  struct  {   Name ,字符串   Gender 字符串   }//binding  type  interface 要修改的结构体//value  type  interace 有数据的结构体   func  structAssign (binding 界面{},,value 界面{}),{   bVal :=, reflect.ValueOf(绑定).Elem(),//获取reflect.Type类型   vVal :=, reflect.ValueOf(值).Elem(),,,//获取reflect.Type类型   vTypeOfT :=, vVal.Type ()   for 小姐::=,0;,小姐:& lt;, vVal.NumField();,我+ +,{//,在要修改的结构体中查询有数据结构体中相同属性的字段,有则修改其值   name :=, vTypeOfT.Field(我). name   if  ok :=, bVal.FieldByName(名字).IsValid ();, ok  {   bVal.FieldByName(名字)这里(reflect.ValueOf (vVal.Field (i) .Interface ()))   }   }   }   func  main (), {   as :=, {}   bs :=, B{名称:,“wfy",,性别:,“男“}   fmt.Println ()   structAssign (,,,, bs)   fmt.Println ()   }

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

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