CN113672311A - 结构体赋值方法、赋值器及计算机可读存储介质 - Google Patents
结构体赋值方法、赋值器及计算机可读存储介质 Download PDFInfo
- Publication number
- CN113672311A CN113672311A CN202111237304.6A CN202111237304A CN113672311A CN 113672311 A CN113672311 A CN 113672311A CN 202111237304 A CN202111237304 A CN 202111237304A CN 113672311 A CN113672311 A CN 113672311A
- Authority
- CN
- China
- Prior art keywords
- field
- assignment
- variable
- struct
- fields
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种结构体赋值方法、赋值器及计算机可读存储介质,所述结构体赋值方法为:赋值变量的类型包括了map类、struct类或者指向struct的指针,通过对赋值变量中每个字段的遍历,将赋值变量中单个字段的值赋值给被赋值变量中与单个字段对应的Field的值,从而完成整个赋值变量对被赋值变量的赋值,实现结构体给结构体赋值(struct to struct)和集合给结构体赋值(map to struct),还通过将赋值变量或者被赋值变量中值的数据类型进行转换,实现数据类型不同的值之间的赋值功能,满足了用户在面对更多应用场景时灵活赋值的需求。
Description
技术领域
本发明涉及go语言编程领域,尤其涉及一种结构体赋值方法、赋值器及计算机可读存储介质。
背景技术
在Go语言(Go是一种为高并发而生的高级编程语言)里,因为官方标准库里没有针对结构体赋值(struct to struct)提供开箱即用package,而在当前互联网行业中常用开源项目copier对结构体进行赋值,但它所具备的主要功能没有包含集合给结构体赋值(mapto struct),因此现有技术无法满足用户在面对更多应用场景时灵活赋值的需求。
发明内容
本发明的主要目的在于提供一种结构体赋值方法,旨在解决现有技术无法满足用户在面对更多应用场景时灵活赋值的需求的问题。
为实现上述目的,本发明提供一种结构体赋值方法,所述结构体赋值方法包括以下步骤:
获取赋值变量的reflect.Value对象,并根据所述赋值变量的reflect.Value对象判断所述赋值变量的数据类型是否为map类、struct类或者指向struct的指针中的任意一种;
若所述赋值变量的数据类型为map类、struct类或者指向struct的指针中的任意一种,则通过被赋值变量的指针获取被赋值变量的reflect.Value对象;
根据所述被赋值变量的reflect.Value对象判断被赋值变量的数据类型是否为struct类,若所述被赋值变量的数据类型是struct类,则获取所述被赋值变量的Field以及Field对应的值;
获取所述赋值变量的字段及字段对应的值,并遍历所述赋值变量中所有字段,将赋值变量中字段对应的值,赋值给被赋值变量中与所述赋值变量中字段描述相同的Field所对应的值;
遍历完成后,则赋值变量给被赋值变量赋值完成。
进一步的,在所述遍历所述赋值变量中所有字段的步骤之前,所述结构体赋值方法还包括:
基于用户操作构建赋值变量中的字段与被赋值变量中的Field之间的字段映射关系表。
进一步的,所述遍历所述赋值变量中所有字段,将赋值变量中字段对应的值,赋值给被赋值变量中与所述赋值变量中字段描述相同的Field所对应的值的步骤包括:
获取所述赋值变量中任意单个字段并进行预设的字段描述判断,所述字段描述判断为:判断被赋值变量中是否存在与所述单个字段描述相同的Field,若存在,则获取被赋值变量中与所述单个字段描述相同的Field对应的值;
判断所述单个字段对应的值的数据类型是否与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同;
若数据类型相同,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值;
当所述赋值变量所有单个字段都进行了字段描述判断后,则遍历完成。
进一步的,所述判断被赋值变量中是否存在与所述单个字段描述相同的Field的步骤之后,包括:
若不存在,则根据所述字段映射关系表,获取与所述单个字段成映射关系的Field,判定被赋值变量中与所述单个字段成映射关系的Field与所述单个字段描述相同。
进一步的,所述获取所述赋值变量的字段及字段对应的值的步骤之后,包括:
基于用户操作对所述赋值变量中部分字段及部分字段对应的值进行忽略,被忽略部分的字段不参与遍历。
进一步的,所述获取所述赋值变量的字段及字段对应的值包括:
当所述赋值变量的数据类型为map类时,则所述赋值变量的字段为key;
当所述赋值变量的数据类型为struct类时,则所述赋值变量的字段为Field;
当所述赋值变量的数据类型为指向struct的指针时,根据所述指向struct的指针获取struct,并将指针指向的struct作为赋值变量,此时赋值变量的数据类型为struct类,则所述赋值变量的字段为Field。
进一步的,所述若数据类型相同,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值包括:
当判断数据类型相同后,判断所述单个字段对应的值的字节位数是否大于与被赋值变量中与所述单个字段描述相同的Field所对应的值的字节位数;
若判断为否,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值。
进一步的,所述判断所述单个字段对应的值的数据类型是否与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同的步骤之后,包括:
若数据类型不同,则判断所述单个字段对应的值的数据类型是否为struct类;
若所述单个字段对应的值的数据类型是struct类,且所述单个字段对应的值的封装路径为database/sql,所述单个字段对应的值的struct名称为预设名称;
判断所述struct名称是否存在被赋值变量中与所述单个字段描述相同的Field所对应的值数据类型,若存在,则判定所述单个字段对应的值的数据类型与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同。
本发明还提供一种赋值器,其特征在于,所述赋值器包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的结构体赋值程序,所述结构体赋值程序被所述处理器执行时实现如上述的结构体赋值方法的步骤。
本发明还提供一种计算机可读存储介质,其特征在于,所述可读存储介质上存储有结构体赋值程序,所述结构体赋值程序被处理器执行时实现如上述的结构体赋值方法的步骤。
在本实施例中,赋值变量的类型包括了map、struct或者指向struct的指针,通过对赋值变量中每个字段的遍历,将赋值变量中单个字段的值赋值给被赋值变量中与单个字段对应的Field的值,从而完成整个赋值变量对被赋值变量的赋值,实现结构体给结构体赋值(struct to struct)和集合给结构体赋值(map to struct),此外,本方案通过对值数据类型的转换,实现数据类型不同的值之间的赋值,满足了用户在面对更多应用场景时灵活赋值的需求。
附图说明
图1是本发明实施例方案涉及的硬件运行环境的赋值器结构示意图;
图2为本发明结构体赋值方法中第一实施例的流程示意图;
图3为本发明结构体赋值方法中步骤S40的细化流程示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,图1是本发明实施例方案涉及的硬件运行环境的赋值器示意图。
本发明实施例赋值器可以是PC,也可以是平板电脑、便携计算机等具有数据读取、处理和输出功能的电子设备。
如图1所示,赋值器可以包括:处理器1001,例如CPU,网络接口1004,用户接口1003,存储器1005,通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(Display)、输入单元比如键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
可选地,终端还可以包括摄像头、RF(Radio Frequency,射频)电路,传感器、音频电路、WiFi模块等等。其中,传感器比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示屏的亮度,接近传感器可在移动终端移动到耳边时,关闭显示屏和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别移动终端姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;当然,移动终端还可配置陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
本领域技术人员可以理解,图1中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及结构体赋值程序。
在图1所示的终端中,网络接口1004主要用于连接后台服务器,与后台服务器进行数据通信;用户接口1003主要用于连接客户端(用户端),与客户端进行数据通信;而处理器1001可以用于调用存储器1005中存储的结构体赋值程序,并执行以下操作:
获取赋值变量的reflect.Value对象,并根据所述赋值变量的reflect.Value对象判断所述赋值变量的数据类型是否为map类、struct类或者指向struct的指针中的任意一种;
若所述赋值变量的数据类型为map类、struct类或者指向struct的指针中的任意一种,则通过被赋值变量的指针获取被赋值变量的reflect.Value对象;
根据所述被赋值变量的reflect.Value对象判断被赋值变量的数据类型是否为struct类,若所述被赋值变量的数据类型是struct类,则获取所述被赋值变量的Field以及Field对应的值;
获取所述赋值变量的字段及字段对应的值,并遍历所述赋值变量中所有字段,将赋值变量中字段对应的值,赋值给被赋值变量中与所述赋值变量中字段描述相同的Field所对应的值;
遍历完成后,则赋值变量给被赋值变量赋值完成。
进一步地,处理器1001可以调用存储器1005中存储的结构体赋值程序,还执行以下操作:
在所述遍历所述赋值变量中所有字段的步骤之前,所述结构体赋值方法还包括:
基于用户操作构建赋值变量中的字段与被赋值变量中的Field之间的字段映射关系表。
进一步地,处理器1001可以调用存储器1005中存储的结构体赋值程序,还执行以下操作:
所述遍历所述赋值变量中所有字段,将赋值变量中字段对应的值,赋值给被赋值变量中与所述赋值变量中字段描述相同的Field所对应的值的步骤包括:
获取所述赋值变量中任意单个字段并进行预设的字段描述判断,所述字段描述判断为:判断被赋值变量中是否存在与所述单个字段描述相同的Field,若存在,则获取被赋值变量中与所述单个字段描述相同的Field对应的值;
判断所述单个字段对应的值的数据类型是否与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同;
若数据类型相同,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值;
当所述赋值变量所有单个字段都进行了字段描述判断后,则遍历完成。
进一步地,处理器1001可以调用存储器1005中存储的结构体赋值程序,还执行以下操作:
所述判断被赋值变量中是否存在与所述单个字段描述相同的Field的步骤之后,包括:
若不存在,则根据所述字段映射关系表,获取与所述单个字段成映射关系的Field,判定被赋值变量中与所述单个字段成映射关系的Field与所述单个字段描述相同。
进一步地,处理器1001可以调用存储器1005中存储的结构体赋值程序,还执行以下操作:
所述获取所述赋值变量的字段及字段对应的值的步骤之后,包括:
基于用户操作对所述赋值变量中部分字段及部分字段对应的值进行忽略,被忽略部分的字段不参与遍历。
进一步地,处理器1001可以调用存储器1005中存储的结构体赋值程序,还执行以下操作:
所述获取所述赋值变量的字段及字段对应的值包括:
当所述赋值变量的数据类型为map类时,则所述赋值变量的字段为key;
当所述赋值变量的数据类型为struct类时,则所述赋值变量的字段为Field;
当所述赋值变量的数据类型为指向struct的指针时,根据所述指向struct的指针获取struct,并将指针指向的struct作为赋值变量,此时赋值变量的数据类型为struct类,则所述赋值变量的字段为Field。
进一步地,处理器1001可以调用存储器1005中存储的结构体赋值程序,还执行以下操作:
所述若数据类型相同,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值包括:
当判断数据类型相同后,判断所述单个字段对应的值的字节位数是否大于与被赋值变量中与所述单个字段描述相同的Field所对应的值的字节位数;
若判断为否,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值。
进一步地,处理器1001可以调用存储器1005中存储的结构体赋值程序,还执行以下操作:
所述判断所述单个字段对应的值的数据类型是否与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同的步骤之后,包括:
若数据类型不同,则判断所述单个字段对应的值的数据类型是否为struct类;
若所述单个字段对应的值的数据类型是struct类,且所述单个字段对应的值的封装路径为database/sql,所述单个字段对应的值的struct名称为预设名称;
判断所述struct名称是否存在被赋值变量中与所述单个字段描述相同的Field所对应的值数据类型,若存在,则判定所述单个字段对应的值的数据类型与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同。
参照图2,本发明结构体赋值方法中的第一实施例,所述结构体赋值方法包括:
步骤S10,获取赋值变量的reflect.Value对象,并根据所述赋值变量的reflect.Value对象判断所述赋值变量的数据类型是否为map类、struct类或者指向struct的指针中的任意一种;
在go语言中,将赋值变量赋值给被赋值变量时,首先将赋值变量的接口传递给reflect.ValueOf函数调用,此调用返回赋值变量接口所储存信息的reflect.Value对象,即获取到了赋值变量的reflect.Value对象,进一步,通过Value的Kind()方法,判断所述赋值变量的数据类型。在本实施例中主要针对现有技术的缺点,因此赋值变量类型为map类、struct类或者指向struct的指针,若赋值变量不为所述的三种类型,则将会返回错误信息停止赋值。
可以理解的是,本实施例中给被赋值变量的赋值变量类型将包含map类,满足了用户将集合赋值给结构体(map to struct)的赋值的需求。
步骤S20,若所述赋值变量的数据类型为map类、struct类或者指向struct的指针中的任意一种,则通过被赋值变量的指针获取被赋值变量的reflect.Value对象;
当确认赋值变量的类型为map类、struct类或者指向struct的指针中的任意一种后,则需要确认被赋值变量类型是否为struct类。可以理解的是本实施例是对被赋值变量进行赋值涉及到被赋值变量值的修改,因此必须获取到被赋值变量的指针。而为保证获取到的指针与被赋值变量对应,在获取被赋值变量的reflect.Value对象之前,首先将指向被赋值变量的指针的接口传递给reflect.ValueOf函数调用,该函数返回一个指针的reflect.Value对象;进一步使用Value.Kind()判断上述接口中储存的信息是否为指针类型,确保获取到指针,否则停止赋值并报出错误信息;当确定为指针类型后,则通过Value.Elem()返回所述指针指向的被赋值变量的reflect.Value对象,确保指针与被赋值变量对应。
可以理解是的,本实施中通过多次判断检验,保证获取到指向被赋值变量的指针,以及获取到的指针是指向被赋值变量的。
步骤S30,根据所述被赋值变量的reflect.Value对象判断被赋值变量的数据类型是否为struct类,若所述被赋值变量的数据类型是struct类,则获取所述被赋值变量的Field以及Field对应的值;
根据指针所述指向的被赋值变量的reflect.Value对象再次使用Value.Kind()判断所述指向的被赋值变量类型是否为struct类,若不是则停止赋值并报出错误信息。当确定被赋值变量类型为struct类后,则获取struct类被赋值变量中的所有Field以及Field对应的值。
步骤S40,获取所述赋值变量的字段及字段对应的值,并遍历所述赋值变量中所有字段,将赋值变量中字段对应的值,赋值给被赋值变量中与所述赋值变量中字段描述相同的Field所对应的值;
可以理解的是,本实施例中赋值变量的类型可以是map类、struct类和指向struct的指针,因此当所述赋值变量的数据类型为map类时,则所述赋值变量的字段为key;当所述赋值变量的数据类型为struct类时,则所述赋值变量的字段为Field;当所述赋值变量的数据类型为指向struct的指针时,根据所述指向struct的指针获取struct,并将指针指向的struct作为赋值变量,此时赋值变量的数据类型为struct类,则所述赋值变量的字段为Field,当获取到赋值变量中所有字段后,基于用户操作对所述赋值变量中部分字段及部分字段对应的值进行忽略,被忽略部分的字段不参与遍历。如赋值变量中存在有敏感信息不能随意赋值时,通过调用函数Option.IgnoreFields忽略掉用户选择忽略的那部分field,在后续的对字段的遍历过程中将会直接跳过这部分选择忽略的字段,从而避免敏感信息传递到外界。
对赋值变量中的所有字段进行遍历,所述遍历包括获取所述赋值变量中任意单个字段并进行预设的字段描述判断,所述字段描述判断为:判断被赋值变量中是否存在与所述单个字段描述相同的Field,若存在,则获取被赋值变量中与所述单个字段描述相同的Field对应的值;判断所述单个字段对应的值的数据类型是否与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同;若数据类型相同,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值;当所述赋值变量所有单个字段都进行了字段描述判断后,则遍历完成。
如:A为map类型的赋值变量;B为struct类型的被赋值变量。此时需要将A赋值给B,而A中单个字段1key的描述为年龄且其对应的值为18岁,2key的描述为身高且其对应的值为170cm;B中单个字段1Field的描述为年龄且其对应的值为20岁,2Field的描述为身高且对应的值为1.75m。在对A的所有字段进行遍历时,获取到单个字段1key描述为年龄后,通过FieldByName()判断在B中能否找到同为年龄描述的Field,根据上述例子可知,B中存在有1Field描述为年龄,因此存在,进一步获取1key对应的值18岁和1Field对应的值20岁,通过reflect.Kind()判断1key对应的值的数据类型为岁且1Field对应的值的数据类型也为岁,数据类型相同则将1key对应的值18岁覆盖1Field对应的值20岁,此时B中1Field对应的值变为18岁,即完成一个字段的赋值,再重新获取新的单个字段进行上述赋值过程,直到所以有key都被获取过。
为更清楚的描述遍历过程,以for循环为例进行说明。首先通过reflect.Type()获取到赋值变量所有值类型的Type,再根据Type通过NumField()获取赋值变量中的总字段数(将所有字段进行标号,标号值为0到总字段数减1),设置自变量i的初始值为0,在进行遍历时先判断i是否小于所述总字段数,若小于则获取第i个字段,对第i个字段进行上述单个字段的赋值过程,当第i个字段赋值完成后,将i加1再赋值给i,再次执行上述判断i是否小于所述总字段数的步骤。
步骤S50,遍历完成后,则赋值变量给被赋值变量赋值完成。
当遍历赋值完成后,或者以为for循环为例进行说明,则是退出for循环后,赋值变量给被赋值变量赋值完成。
在本实施例中,赋值变量的数据类型包括了map类、struct类或者指向struct的指针,通过对赋值变量中每个字段的遍历,将赋值变量中单个字段的值赋值给被赋值变量中与单个字段对应的Field的值,从而完成整个赋值变量对被赋值变量的赋值,实现结构体给结构体赋值(struct to struct)和集合给结构体赋值(map to struct)。满足了用户在面对更多应用场景时灵活赋值的需求。
进一步的,参照图3,本发明提供另一实施例,步骤S40包括:
步骤S410,获取所述赋值变量中任意单个字段并进行预设字段描述判断,所预设字段描述判断为:判断被赋值变量中是否存在与所述单个字段描述相同的Field;
完成对所述赋值变量中所有字段的遍历,需要对每个字段进行字段描述判断,以确定赋值变量中每个字段对应的值的赋值对象,如某一赋值变为map类型,其中某个key描述为年龄,而被赋值变量为struct类型,其中某个Fieid描述为年龄,则认为被赋值变量中存在与所述单个字段描述相同的Field,反之则不存在。
步骤S411,若存在,则获取被赋值变量中与所述单个字段描述相同的Field对应的值;
当被赋值变量中存在与所述单个字段描述相同的Field时,进一步获取被赋值变量中与所述单个字段描述相同的Field对应的值,如在map类型的赋值变中key描述为年龄,则获取struct类型的被赋值变量中描述为年龄的Fieid对应的值。便于在后描述中对值的数据类型进行判断。
步骤S412,若不存在,则根据所述字段映射关系表,获取与所述单个字段成映射关系的Field,判定被赋值变量中与所述单个字段成映射关系的Field与所述单个字段描述相同;
在开始将赋值变量给被赋值变量赋值之前,还会基于用户操作构建赋值变量中的字段与被赋值变量中的Field之间的字段映射关系表。如在上述AB例子,其中,A中单个字段1key的描述为年龄,B中单个字段1Field的描述为年纪,但是1key的描述年龄和1Field的描述年纪虽然文字不一致,但是实际含义相同,同样相同含义的字段描述还可能是年岁、岁数和年数等,因此在开始赋值之前,由用户将描述不同但含义一致的字段通过设置Option.FieldsMapping来确定映射关系,如在映射表中建立年龄、年岁、岁数、年数和年纪之间的等同映射关系。因此在判断被赋值变量中是否存在与所述单个字段描述相同的Field,且判断结果为不存在时,则根据所述字段映射关系表,获取与所述单个字段成映射的Field(可以是一个Field也可以是多个Field),进一步,判断被赋值变量中是否存在与所述单个字段成映射关系的Field,如当获取到A中单个字段1key其描述为年龄,但在B中并未找到与年龄文字描述一致的Field,此时进一步在映射表中查找与年龄为等同映射关系的其他字段描述年岁、岁数、年数和年纪,而在B中存在1Field的描述为年纪,此时则认为1key的描述与1Field的描述相同。但是若B依然中不存在如年岁、岁数、年数和年纪的描述则跳过A中描述为年龄的单个字段1key,进行下一个字段的遍历赋值。
步骤S420,判断所述单个字段对应的值的数据类型是否与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同;
当确定所述赋值变量中所述的单个字段描述与被赋值变量中某个Field的描述相同后,进一步判断该字段对应的值数据类型是否与Field的值的数据类型相同,避免不同数据类型的值之间相互赋值造成最终赋值结果错误的问题。
步骤S421,若数据类型相同,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值;
当判断数据类型相同后,判断所述单个字段对应的值的字节位数是否大于与被赋值变量中与所述单个字段描述相同的Field所对应的值的字节位数;若判断为否,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值。当判断所述单个字段对应的值的字节位数大于与被赋值变量中与所述单个字段描述相同的Field所对应的值的字节位数时,则输出错误信息并中止赋值跳过该字段,避免高位值给低位值赋值,造成越界的问题。
步骤S422,若数据类型不同,则判断所述单个字段对应的值的数据类型的数据类型是否为struct类;
当判断赋值变量和被赋值变量需要进行赋值的两个值的数据类型不一致时,使用上述同样数据类型判断方法,使用reflect.ValueOf函数获取赋值变量中所述单个字段对应值的数据类型的Value对象,再通过Value.Kind()判断获取到的Value对象是否为struct类型。若所述单个字段对应的值的数据类型的数据类型是struct类,且所述单个字段对应的值数据类型封装路径为database/sql,所述单个字段对应的值数据类型的结构体名称为预设名称。
若单个字段对应的值数据类型封装路径和单个字段对应的值数据类型的结构体名称不满足上述条件则报错并中止赋值,其中,所述预设名称包括:NullString/NullInt64/NullInt32/NullFloat64/NullBool/NullTime。
步骤S423,若是struct类,判断所述struct名称是否存在被赋值变量中与所述单个字段描述相同的Field所对应的值数据类型,若存在,则判定所述单个字段对应的值的数据类型与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同。
若所述单个字段对应的值的数据类型是struct类,且所述单个字段对应的值数据类型封装路径为database/sql,所述单个字段对应的值数据类型的结构体名称(struct名称)为预设名称,可以理解的是由于所述单个字段对应的值的数据类型是struct类,因此需要通过reflect.TypeOf()函数获取所述单个字段对应的值的基本数据类型(数个不同的基本数据类型可构成struct类型),进一步判断所述单个字段对应的值的基本数据类型中是否存在被赋值变量中与所述单个字段描述相同的Field所对应的值数据类型,若存在则认为所述单个字段对应的值的数据类型与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同,并将单个字段对应的值中基本数据类型相同的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值。如当所述单个字段对应的值的结构体名称(struct名称)为NullString/NullInt64/NullInt32时,被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型为NullInt64,则认为所述单个字段对应的值的数据类型与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同,在后续的赋值中将单个字段对应的值中数据类型为NullInt64部分的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值。
此外,若单个字段对应的数据类型不是struct类时,但被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型是struct类时,且被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型满足封装路径为database/sql,被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型的结构体名称(struct名称)为预设名称时,使用上述同样的赋值方式进行赋值。
在本实施例中,通过设置字段映射关系表使得描述不一致但含义一致的字段可以相互进行赋值,同时增加对赋值变中字段和被赋值变量中Field对应值的数据类型和位数进行判断,避免赋值后发生越界的问题,此外,当赋值变量中字段对应值的数据类型与被赋值变量中Field对应值的数据类型不一致时还会针对不同情况对两个值对应的数据类型进行转化,根据转化后的结果进一步判断数据类型是否相同,解决了在两个值数据类型不同是不能相互赋值的问题,满足用户在不同应用场景下的赋值需求。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (10)
1.一种结构体赋值方法,其特征在于,所述结构体赋值方法包括以下步骤:
获取赋值变量的reflect.Value对象,并根据所述赋值变量的reflect.Value对象判断所述赋值变量的数据类型是否为map类、struct类或者指向struct的指针中的任意一种;
若所述赋值变量的数据类型为map类、struct类或者指向struct的指针中的任意一种,则通过被赋值变量的指针获取被赋值变量的reflect.Value对象;
根据所述被赋值变量的reflect.Value对象判断被赋值变量的数据类型是否为struct类,若所述被赋值变量的数据类型是struct类,则获取所述被赋值变量的Field以及Field对应的值;
获取所述赋值变量的字段及字段对应的值,并遍历所述赋值变量中所有字段,将赋值变量中字段对应的值,赋值给被赋值变量中与所述赋值变量中字段描述相同的Field所对应的值;
遍历完成后,则赋值变量给被赋值变量赋值完成。
2.如权利要求1所述的结构体赋值方法,其特征在于,在所述遍历所述赋值变量中所有字段的步骤之前,所述结构体赋值方法还包括:
基于用户操作构建赋值变量中的字段与被赋值变量中的Field之间的字段映射关系表。
3.如权利要求2所述的结构体赋值方法,其特征在于,所述遍历所述赋值变量中所有字段,将赋值变量中字段对应的值,赋值给被赋值变量中与所述赋值变量中字段描述相同的Field所对应的值的步骤包括:
获取所述赋值变量中任意单个字段并进行预设的字段描述判断,所述字段描述判断为:判断被赋值变量中是否存在与所述单个字段描述相同的Field,若存在,则获取被赋值变量中与所述单个字段描述相同的Field对应的值;
判断所述单个字段对应的值的数据类型是否与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同;
若数据类型相同,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值;
当所述赋值变量所有单个字段都进行了字段描述判断后,则遍历完成。
4.如权利要求3所述的结构体赋值方法,其特征在于,所述判断被赋值变量中是否存在与所述单个字段描述相同的Field的步骤之后,包括:
若不存在,则根据所述字段映射关系表,获取与所述单个字段成映射关系的Field,判定被赋值变量中与所述单个字段成映射关系的Field与所述单个字段描述相同。
5.如权利要求4所述的结构体赋值方法,其特征在于,所述获取所述赋值变量的字段及字段对应的值的步骤之后,包括:
基于用户操作对所述赋值变量中部分字段及部分字段对应的值进行忽略,被忽略部分的字段不参与遍历。
6.如权利要求5所述的结构体赋值方法,其特征在于,所述获取所述赋值变量的字段及字段对应的值包括:
当所述赋值变量的数据类型为map类时,则所述赋值变量的字段为key;
当所述赋值变量的数据类型为struct类时,则所述赋值变量的字段为Field;
当所述赋值变量的数据类型为指向struct的指针时,根据所述指向struct的指针获取struct,并将指针指向的struct作为赋值变量,此时赋值变量的数据类型为struct类,则所述赋值变量的字段为Field。
7.如权利要求6所述的结构体赋值方法,其特征在于,所述若数据类型相同,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值包括:
当判断数据类型相同后,判断所述单个字段对应的值的字节位数是否大于与被赋值变量中与所述单个字段描述相同的Field所对应的值的字节位数;
若判断为否,则将所述单个字段对应的值赋值给被赋值变量中与所述单个字段描述相同的Field所对应的值。
8.如权利要求7所述的结构体赋值方法,其特征在于,所述判断所述单个字段对应的值的数据类型是否与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同的步骤之后,包括:
若数据类型不同,则判断所述单个字段对应的值的数据类型是否为struct类;
若所述单个字段对应的值的数据类型是struct类,且所述单个字段对应的值的封装路径为database/sql,所述单个字段对应的值的struct名称为预设名称;
判断所述struct名称是否存在被赋值变量中与所述单个字段描述相同的Field所对应的值数据类型,若存在,则判定所述单个字段对应的值的数据类型与被赋值变量中与所述单个字段描述相同的Field所对应的值的数据类型相同。
9.一种赋值器,其特征在于,所述赋值器包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的结构体赋值程序,所述结构体赋值程序被所述处理器执行时实现如权利要求1至8中任一项所述的结构体赋值方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述可读存储介质上存储有结构体赋值程序,所述结构体赋值程序被处理器执行时实现如权利要求1至8中任一项所述的结构体赋值方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111237304.6A CN113672311A (zh) | 2021-10-25 | 2021-10-25 | 结构体赋值方法、赋值器及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111237304.6A CN113672311A (zh) | 2021-10-25 | 2021-10-25 | 结构体赋值方法、赋值器及计算机可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113672311A true CN113672311A (zh) | 2021-11-19 |
Family
ID=78550963
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111237304.6A Pending CN113672311A (zh) | 2021-10-25 | 2021-10-25 | 结构体赋值方法、赋值器及计算机可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113672311A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115858457A (zh) * | 2023-02-09 | 2023-03-28 | 中航金网(北京)电子商务有限公司 | 文件转换方法、装置及电子设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112328231A (zh) * | 2020-10-14 | 2021-02-05 | 远江盛邦(北京)网络安全科技股份有限公司 | python字典和结构体间的快速转换方法 |
WO2021023149A1 (zh) * | 2019-08-05 | 2021-02-11 | 中国建设银行股份有限公司 | 一种动态返回报文的方法和装置 |
-
2021
- 2021-10-25 CN CN202111237304.6A patent/CN113672311A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2021023149A1 (zh) * | 2019-08-05 | 2021-02-11 | 中国建设银行股份有限公司 | 一种动态返回报文的方法和装置 |
CN112328231A (zh) * | 2020-10-14 | 2021-02-05 | 远江盛邦(北京)网络安全科技股份有限公司 | python字典和结构体间的快速转换方法 |
Non-Patent Citations (2)
Title |
---|
BUTTERFLY5211314: "2- golang 实现两个结构体复制字段", 《HTTPS://WWW.JB51.NET/ARTICLE/210990.HTM》 * |
一只肥豚鼠: "Golang 用interface{} map 给struct赋值", 《HTTPS://WWW.JIANSHU.COM/P/099B151F5DD5》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115858457A (zh) * | 2023-02-09 | 2023-03-28 | 中航金网(北京)电子商务有限公司 | 文件转换方法、装置及电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108768875B (zh) | 应用的灰度发布方法、装置及计算机可读存储介质 | |
CN107291497B (zh) | 多固件升级方法、系统及可读存储介质 | |
CN110018860B (zh) | 工作流管理方法、装置、设备和计算机存储介质 | |
US10798351B2 (en) | Apparatus, method and system for location based touch | |
CN109215640B (zh) | 语音识别方法、智能终端及计算机可读存储介质 | |
CN110827825A (zh) | 语音识别文本的标点预测方法、系统、终端及存储介质 | |
CN111090866A (zh) | 应用权限管理方法、移动终端以及计算机可读存储介质 | |
CN112817657A (zh) | 一种应用程序启动项加载方法、装置、系统及存储介质 | |
CN114640727B (zh) | 协议解析方法、装置及计算机可读存储介质 | |
CN107918509B (zh) | 软件快捷方式提示设置方法、装置及可读存储介质 | |
CN112527386B (zh) | 应用程序发布方法及装置 | |
CN113672311A (zh) | 结构体赋值方法、赋值器及计算机可读存储介质 | |
CN111857672A (zh) | 基于配置sql的业务开发方法、装置、设备及介质 | |
KR20200079081A (ko) | 콘텐트 공유 방법 및 그 전자 장치 | |
CN113934618A (zh) | 接口测试用例生成方法、装置、生成器及可读存储介质 | |
CN113256253A (zh) | 数据处理方法、装置、设备、计算机可读存储介质及产品 | |
CN110704183B (zh) | 数据处理方法、系统及计算机可读存储介质 | |
CN111030848B (zh) | 电子产品自动配置方法、装置和存储介质 | |
CN113986338B (zh) | 项目扫包方法、系统、设备及计算机可读存储介质 | |
CN113918499B (zh) | 开放接口生成方法、网络设备及计算机可读存储介质 | |
CN111565333A (zh) | 基于数据分离的数据修改方法、电视机及存储介质 | |
CN116049020B (zh) | 软件产品的自动化测试方法、装置、设备及可读存储介质 | |
CN109726111B (zh) | 测试规则订制方法、设备、装置及计算机可读存储介质 | |
CN111556354B (zh) | 全局界面显示方法、电视及计算机可读存储介质 | |
CN113012002A (zh) | 海外商标注册方法、装置、设备及计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20211119 |