介绍
怎么在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中实现两个结构体复制字段