鄂州网站建设公司海南平台网站建设平台

diannao/2025/10/13 8:24:38/文章来源:
鄂州网站建设公司,海南平台网站建设平台,网站首页的重要性,职业做网站游戏的介绍 先来介绍一下 mapstructure 这个库主要用来做什么的吧#xff0c;官网是这么介绍的#xff1a; mapstructure 是一个 Go 库#xff0c;用于将通用映射值解码为结构#xff0c;反之亦然#xff0c;同时提供有用的错误处理。 该库在解码数据流#xff08;JSON、Gob …介绍 先来介绍一下 mapstructure 这个库主要用来做什么的吧官网是这么介绍的 mapstructure 是一个 Go 库用于将通用映射值解码为结构反之亦然同时提供有用的错误处理。 该库在解码数据流JSON、Gob 等中的值时最为有用因为在读取部分数据之前您并不十分清楚底层数据的结构。因此您可以读取 map[string]interface{} 并使用此库将其解码为适当的本地 Go 底层结构。 简单来说它擅长解析一些我们并不十分清楚底层数据结构的数据流到我们定义的结构体中。 下面我们通过几个例子来简单介绍一下 mapstructure 怎么使用。 例子 普通形式 func normalDecode() {type Person struct {Name stringAge intEmails []stringExtra map[string]string}// 此输入可以来自任何地方但通常来自诸如解码 JSON 之类的东西我们最初不太确定结构。input : map[string]interface{}{name: Tim,age: 31,emails: []string{onegmail.com, twogmail.com, threegmail.com},extra: map[string]string{twitter: Tim,},}var result Personerr : mapstructure.Decode(input, result)if err ! nil {panic(err)}fmt.Printf(%#v\n, result) } 输出 main.Person{Name:Tim, Age:31, Emails:[]string{onegmail.com, twogmail.com, threegmail.com}, Extra:map[string]string{twitter:Tim}} 这个方式应该是我们最经常使用的非常简单的将 map[string]interface{} 映射到我们的结构体中。 在这里我们并没有指定每个 field 的 tag让 mapstructure 自动去映射。 如果我们的 input 是一个 json 字符串那么我们需要将 json 字符串解析为 map[string]interface{} 之后再将其映射到我们的结构体中。 func jsonDecode() {var jsonStr {name: Tim,age: 31,gender: male }type Person struct {Name stringAge intGender string}m : make(map[string]interface{})err : json.Unmarshal([]byte(jsonStr), m)if err ! nil {panic(err)}var result Personerr mapstructure.Decode(m, result)if err ! nil {panic(err.Error())}fmt.Printf(%#v\n, result) } 输出 main.Person{Name:Tim, Age:31, Gender:male} 嵌入式结构 mapstructure 允许我们压缩多个嵌入式结构并通过 squash 标签进行处理。 func embeddedStructDecode() {// 使用 squash 标签允许压缩多个嵌入式结构。通过创建多种类型的复合结构并对其进行解码来演示此功能。type Family struct {LastName string}type Location struct {City string}type Person struct {Family mapstructure:,squashLocation mapstructure:,squashFirstName string}input : map[string]interface{}{FirstName: Tim,LastName: Liu,City: China, Guangdong,}var result Personerr : mapstructure.Decode(input, result)if err ! nil {panic(err)}fmt.Printf(%s %s, %s\n, result.FirstName, result.LastName, result.City) } 输出 Tim Liu, China, Guangdong 在这个例子中 Person 里面有着 Location 和 Family 的嵌入式结构体通过 squash 标签进行压缩从而达到平铺的作用。 元数据 func metadataDecode() {type Person struct {Name stringAge intGender string}// 此输入可以来自任何地方但通常来自诸如解码 JSON 之类的东西我们最初不太确定结构。input : map[string]interface{}{name: Tim,age: 31,email: onegmail.com,}// 对于元数据我们制作了一个更高级的 DecoderConfig以便我们可以更细致地配置所使用的解码器。在这种情况下我们只是告诉解码器我们想要跟踪元数据。var md mapstructure.Metadatavar result Personconfig : mapstructure.DecoderConfig{Metadata: md,Result: result,}decoder, err : mapstructure.NewDecoder(config)if err ! nil {panic(err)}if err decoder.Decode(input); err ! nil {panic(err)}fmt.Printf(value: %#v, keys: %#v, Unused keys: %#v, Unset keys: %#v\n, result, md.Keys, md.Unused, md.Unset) } 输出 value: main.Person{Name:Tim, Age:31, Gender:}, keys: []string{Name, Age}, Unused keys: []string{email}, Unset keys: []string{Gender} 从这个例子我们可以看出使用 Metadata 可以记录我们结构体以及 map[string]interface{} 的差异相同的部分会正确映射到对应的字段中而差异则使用了 Unused 和 Unset 来表达。 Unusedmap 中有着结构体所没有的字段。 Unset结构体中有着 map 中所没有的字段。 避免空值的映射 这里的使用其实和内置的 json 库使用方式是一样的都是借助 omitempty 标签来解决。 func omitemptyDecode() {// 添加 omitempty 注释以避免空值的映射键type Family struct {LastName string}type Location struct {City string}type Person struct {*Family mapstructure:,omitempty*Location mapstructure:,omitemptyAge intFirstName string}result : map[string]interface{}{}input : Person{FirstName: Somebody}err : mapstructure.Decode(input, result)if err ! nil {panic(err)}fmt.Printf(%v\n, result) } 输出 map[Age:0 FirstName:Somebody] 这里我们可以看到 *Family 和 *Location 都被设置了 omitempty所以在解析过程中会忽略掉空值。而 Age 没有设置并且 input 中没有对应的 value所以在解析中使用对应类型的零值来表达而 int 类型的零值就是 0。 剩余字段 func remainDataDecode() {type Person struct {Name stringAge intOther map[string]interface{} mapstructure:,remain}input : map[string]interface{}{name: Tim,age: 31,email: onegmail.com,gender: male,}var result Personerr : mapstructure.Decode(input, result)if err ! nil {panic(err)}fmt.Printf(%#v\n, result) } 输出 main.Person{Name:Tim, Age:31, Other:map[string]interface {}{email:onegmail.com, gender:male}} 从代码可以看到 Other 字段被设置了 remain这意味着 input 中没有正确映射的字段都会被放到 Other 中从输出可以看到email 和 gender 已经被正确的放到 Other 中了。 自定义标签 func tagDecode() {// 请注意结构类型中定义的 mapstructure 标签可以指示将值映射到哪些字段。type Person struct {Name string mapstructure:person_nameAge int mapstructure:person_age}input : map[string]interface{}{person_name: Tim,person_age: 31,}var result Personerr : mapstructure.Decode(input, result)if err ! nil {panic(err)}fmt.Printf(%#v\n, result) } 输出 main.Person{Name:Tim, Age:31} 在 Person 结构中我们将 person_name 和 person_age 分别映射到 Name 和 Age 中从而达到在不破坏结构的基础上去正确的解析。 弱类型解析 正如前面所说mapstructure 提供了类似 PHP 解析弱类型结构的方法。 func weaklyTypedInputDecode() {type Person struct {Name stringAge intEmails []string}// 此输入可以来自任何地方但通常来自诸如解码 JSON 之类的东西由 PHP 等弱类型语言生成。input : map[string]interface{}{name: 123, // number stringage: 31, // string numberemails: map[string]interface{}{}, // empty map empty array}var result Personconfig : mapstructure.DecoderConfig{WeaklyTypedInput: true,Result: result,}decoder, err : mapstructure.NewDecoder(config)if err ! nil {panic(err)}err decoder.Decode(input)if err ! nil {panic(err)}fmt.Printf(%#v\n, result) } 输出 main.Person{Name:123, Age:31, Emails:[]string{}} 从代码可以看到input 中的 name、age 和 Person 结构体中的 Name、Age 类型不一致而 email 更是离谱一个字符串数组一个是 map。 但是我们通过自定义 DecoderConfig将 WeaklyTypedInput 设置成 true 之后mapstructure 很容易帮助我们解决这类弱类型的解析问题。 但是也不是所有问题都能解决通过源码我们可以知道有如下限制 // - bools to string (true 1, false 0) // - numbers to string (base 10) // - bools to int/uint (true 1, false 0) // - strings to int/uint (base implied by prefix) // - int to bool (true if value ! 0) // - string to bool (accepts: 1, t, T, TRUE, true, True, 0, f, F, // FALSE, false, False. Anything else is an error) // - empty array empty map and vice versa // - negative numbers to overflowed uint values (base 10) // - slice of maps to a merged map // - single values are converted to slices if required. Each // element is weakly decoded. For example: 4 can become []int{4} // if the target type is an int slice. 大家使用这种弱类型解析的时候也需要注意。 错误处理 mapstructure 错误提示非常的友好下面我们来看看遇到错误时它是怎么提示的。 func decodeErrorHandle() {type Person struct {Name stringAge intEmails []stringExtra map[string]string}input : map[string]interface{}{name: 123,age: bad value,emails: []int{1, 2, 3},}var result Personerr : mapstructure.Decode(input, result)if err ! nil {fmt.Println(err.Error())} } 输出 5 error(s) decoding:* Age expected type int, got unconvertible type string, value: bad value * Emails[0] expected type string, got unconvertible type int, value: 1 * Emails[1] expected type string, got unconvertible type int, value: 2 * Emails[2] expected type string, got unconvertible type int, value: 3 * Name expected type string, got unconvertible type int, value: 123 这里的错误提示会告诉我们每个字段字段里的值应该需要怎么表达我们可以通过这些错误提示比较快的去修复问题。 总结 从上面这些例子看看到 mapstructure 的强大之处很好的帮我们解决了实实在在的问题也在节省我们的开发成本。 但是从源码来看内部使用了大量的反射这可能会对一些特殊场景带来性能隐患。所以大家在使用的时候一定要充分考虑产品逻辑以及场景。 以下贴一小段删减过的源码 // Decode decodes the given raw interface to the target pointer specified // by the configuration. func (d *Decoder) Decode(input interface{}) error {return d.decode(, input, reflect.ValueOf(d.config.Result).Elem()) }// Decodes an unknown data type into a specific reflection value. func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) error {....var err erroroutputKind : getKind(outVal)addMetaKey : trueswitch outputKind {case reflect.Bool:err d.decodeBool(name, input, outVal)case reflect.Interface:err d.decodeBasic(name, input, outVal)case reflect.String:err d.decodeString(name, input, outVal)case reflect.Int:err d.decodeInt(name, input, outVal)case reflect.Uint:err d.decodeUint(name, input, outVal)case reflect.Float32:err d.decodeFloat(name, input, outVal)case reflect.Struct:err d.decodeStruct(name, input, outVal)case reflect.Map:err d.decodeMap(name, input, outVal)case reflect.Ptr:addMetaKey, err d.decodePtr(name, input, outVal)case reflect.Slice:err d.decodeSlice(name, input, outVal)case reflect.Array:err d.decodeArray(name, input, outVal)case reflect.Func:err d.decodeFunc(name, input, outVal)default:// If we reached this point then we werent able to decode itreturn fmt.Errorf(%s: unsupported type: %s, name, outputKind)}// If we reached here, then we successfully decoded SOMETHING, so// mark the key as used if were tracking metainput.if addMetaKey d.config.Metadata ! nil name ! {d.config.Metadata.Keys append(d.config.Metadata.Keys, name)}return err }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何建一个公司的网站获取微信公众号首图

吴用说只有公孙胜可以破法术,于是宋江请戴宗和李逵去蓟州。两人听说公孙胜的师傅罗真人在九宫县二仙山讲经,于是到了二仙山,并在山下找到了公孙胜的家。 两人请公孙胜去帮助打高唐州,公孙胜说听师傅的。罗真人说出家人不管闲事&a…

徐州企业建站模板wordpress新建页面发布内容

Activity生命周期Activity是一个用来提供用户交互界面的组件,它是四大组件之一,对于我们刚刚学习android的菜鸟来说是非常重要的,我们可以将一个屏幕理解为一个Activity,Activity通常是一个全屏的界面,每一个应用程序可…

石家庄物流网站建设长子网站建设

虽然作业还没有做完,但是我还是放不下它,对此,我只想说: 今天你对作业爱理不理,明天它就让你补到飞起 DP先放放,我们要雨露均沾练习上手:乘法逆元题目题解代码实现曹冲养猪?(互质的…

h5网页制作平台seo教程大秦英扬

参考:C语言的枚举类型(Enum) 地址:https://blog.csdn.net/aliyonghang/article/details/123615803?spm1001.2014.3001.5502 在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个…

医院网站制作好吗企业网站手机端跳转设置

摘要:李建中等编著的这本《C语言程序设计实训指导书》为《C语言程序设计》的配套教材.全书共分4部分.第1部分主要介绍Visual C6.0的集成功能界面和操作;第2部分配合主教材的内容,设计了11个实验项目;第3部分对主教材每一章习题给出解答或指导;第4部分为全国计算机等…

怎样给网站做app学做网站卖东西去哪学

package scala06object scala07_ABSClass {// 抽象属性 抽象方法 def main(args: Array[String]): Unit = { // 抽象类用法 // 实例化子类 val student0 = new Student08 student0.sayHi("lisi")// 直接实例化抽象类(匿名子类) //匿名子类 是多态的一种体现 (父…

工具网站有哪些乌海做网站

代理模式的定义: Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问。) 简单说,就是设置一个中间代理来控制访问原目标对象,达到增强原…

建筑专业网站有哪些外包公司劳动合同

1、问题 svn下载的项目路径需要换,也就是下面的URL:SVN:// 需要修改 2、解决办法 linux平台 svn switch --relocate oldSvnPath newSvnPath windows平台 右击项目 TortoiseSVN->Relocate 然后修改就行

做jsp网站用哪些软件下载世界街景地图怎么退订

苹果自带的“safari浏览器”正在悄悄“追踪”你的信息,这样做可以有效避免你的隐私信息不被泄露。说起苹果设备自带的APP,毫无疑问safari浏览器是其中的代表之一,很多朋友由于习惯的原因,大多在使用苹果设备的时候选择下载一些第三…

一般产地证去哪个网站做北京网站设计网站设计公司

无论是从保护电力系统的安全还是从保护用电设备和人身的安全来看,严格控制并限定电流谐波含量,以减少谐波污染造成的危害已成为人们的共识。总谐波失真THD与功率因数 PF 的关系市面上很多的 LED 驱动电源,其输入电路采用简单的桥式整流器和电…

最简单的制作网站46云虚拟主机

设计模式专栏:http://t.csdnimg.cn/4j9Cq 目录 1.简介 2.实现原理 3.QString的实现分析 3.1.内部结构 3.2.写入时复制 4.示例分析 5.使用场景 6.总结 1.简介 CopyOnWrite (COW) 是一种编程思想,用于优化内存使用和提高性能。COW 的基本思想是&am…

山东做外贸网站的公司wordpress 注册侧边栏

rgbif版本:3.7.8.1 什么是多值传参? 您是否在使用rgbif时设想过,给某个参数一次性传递许多个值,它将根据这些值独立地进行请求,各自返回独立的结果。 rgbif支持这种工作模式,但是具体的细节需要进一步地…

深圳网站建设公司团队建站园

先说下结论:如果系统不考虑全球化的话,那么我们不用考虑时区的问题,因为我们可以认为中国境内的计算机全部用的是北京时间。1. 时区的来源和划分地球自转一圈是360度,共24小时,所以1小时15度,即&#xff1a…

在什么网站上可以做免费广告wordpress的背景图片

由于需要测试一款40G网卡,下载了 iperf3.1.3 用于性能测试。 iperf3.1.3 源码下载 可以在 iperf 官网 下载源代码: 交叉编译 需要运行在 aarch64 linux 环境下,所以需要交叉编译。 进入iperf3 目录下,运行 ./configure 脚本…

企业网站和信息化建设重庆建站模板展示

1.介绍 1.1 Pandas是什么? Pandas是一个基于NumPy的分析结构化数据的工具集,NumPy为其提供了高性能的数据处理能力。Pandas被普遍用于数据挖掘和数据分析,同时也提供数据清洗、数据I/O、数据可视化等辅助功能。 Github_Star 40k : https://github.com/…

网站开发人员需要去做原型吗有多少人自己做电影网站

在 QML 中,几乎所有组件都继承自 Item 类型,因此它们共享一些通用的属性。 QML 组件通用属性 位置和尺寸 x 和 y: 组件在其父元素中的位置坐标 Item {x: 100y: 100 }width 和 height: 组件的宽度和高度 Item {width: 200height: 100 }z: 组件在 Z 轴…

vps除了做网站还能做什么公共资源交易中心主任级别

Aethir,去中心化GPU云基础设施领导者,宣布其备受期待的节点销售。Aethir是一家企业级的以AI和游戏为重点的GPU即服务提供商。Aethir的去中心化云计算基础设施使GPU提供商能够与需要NVIDIA的H100芯片提供强大AI/ML任务支持的企业客户相连接。 此外&#x…

茂名企业做网站视频剪辑培训比较有名的学校

来源:科学的乐园在科幻小说《三体Ⅲ:死神永生》之中,歌者文明“母世界”的宇宙飞船曾经利用宇宙规律武器二向箔来摧毁地球文明,将地球所处的三维世界完全变成了一个二维世界。很多人无法想象,仅仅一个手机大小的物质&a…

wordpress 分类判断长沙seo排名收费

教育 -C语言程序设计-章节资料考试资料-南京师范大学中北学院【】 第一章 单元测试 1、【单选题】对于计算机来说,最后执行的C语言程序是( ) A、源程序 B、目标程序 C、汇编程序 D、可执行程序 参考资料【 】 2、【单选题】以下叙述中正确的是…

做企业网站一般用什么服务器如何做网站 知乎

版本回退 修改代码 添加第一个版本 接下同上,添加多个版本 回退到上一个版本 回到旧版本(建议实际中操作) 版本回退和回到旧版本的区别: 版本回退:就是删除当前版本,回到以前的版本。 回到旧版…