go语言map转结构体_go map转struct-程序员宅基地

技术标签: go  go map转换struct  go学习  go map转struct结构  

方式一、通过mapstructure.Decode()方法

可以通过github.com/mitchellh/mapstructure包的mapstructure.Decode(map[string]interface,*struct)方法将map转换成结构体,该方法的参数有两个,第一个参数是要转换的map变量,第二个参数是struct结构体变量指针,下面通过一个例子说明mapstructure.Decode()函数的使用方法,如:

package main

import (
	"fmt"
	"github.com/mitchellh/mapstructure"
)
type student struct{
    
	id int `json:"id"`
	Name string `json:"name"`
	Adress []string `json:"adress"`
}
func main() {
    
	val := map[string]interface{
    }{
    
		"id":1,
		"name":"xiaoming",
		"adress":[]string{
    "beijing","nanjing"},
	}
	stu := student{
    }
	err := mapstructure.Decode(val,&stu)
	if err != nil {
    
		fmt.Println(err.Error())
	}
	fmt.Println("val:")
	fmt.Println(val)
	fmt.Println("struct:")
	fmt.Println(stu)
}

运行结果:

val:
map[adress:[beijing nanjing] id:1 name:xiaoming]
struct:
{
    1 xiaoming [beijing nanjing]}

注意的点:1、map[string]interface的键值将对应字段赋值到结构体时忽略大小写;2、结构体中所有字段名必须以大写字母开头,否则将无法赋值

方式二、通过json序列化和反序列化实现map到struct的转换

可以通过序列化和反序列化操作将map转换为struct, 主要是解决map键值下划线命名和struct字段的驼峰式命名的匹配,下面用一个例子说明,如:

package main

import (
	"fmt"
	"github.com/mitchellh/mapstructure"
)
type student struct{
    
	id int `json:"id"`
	Name string `json:"name"`
	Adress []string `json:"adress"`
	PhoneNumber string `json:"phone_number"`
}
func main() {
    
	val := map[string]interface{
    }{
    
		"id":1,
		"name":"xiaoming",
		"adress":[]string{
    "beijing","nanjing"},
		"phone_number":"12345678",
	}
	stu := student{
    }
	//使用mapstructure.Decode()方法
	err := mapstructure.Decode(val,&stu)
	if err != nil {
    
		fmt.Println(err.Error())
	}
	fmt.Println("val:")
	fmt.Println(val)
	fmt.Println("struct:")
	fmt.Println(stu)
}

运行结果:

val:
map[id:1 ipadress:[beijing nanjing] name:xiaoming phone_number:12345678]
struct:
{
    0 xiaoming [beijing nanjing] }

可以看到,使用mapstructure.Decode()方法没有将phone_number赋值到struct结构体变量的PhoneNumber字段,在有些场景下需要将带有下划线的map转换成struct时,就可以利用序列化和反序列化的方法进行转换,这里主要是通过利用struct字段和json字段的映射关系,通过序列化和反序列化进行map和struct之间的转换,以实现下划线命名和驼峰式命名的相互赋值

package main

import (
	"encoding/json"
	"fmt"
)
type student struct{
    
	id int `json:"id"`
	Name string `json:"name"`
	Adress []string `json:"adress"`
	PhoneNumber string `json:"phone_number"`
}
func main() {
    
	val := map[string]interface{
    }{
    
		"id":1,
		"name":"xiaoming",
		"adress":[]string{
    "beijing","nanjing"},
		"phone_number":"12345678",
	}
	stu := student{
    }
	arr,err := json.Marshal(val)
	if err != nil {
    
		fmt.Println(err)
		return
	}
	err = json.Unmarshal(arr,&stu)
	if err != nil {
    
		fmt.Println(err)
		return
	}
	fmt.Println("val:")
	fmt.Println(val)
	fmt.Println("struct:")
	fmt.Println(stu)
}

运行结果:

val:
map[adress:[beijing nanjing] id:1 name:xiaoming phone_number:12345678]
struct:
{
    0 xiaoming [beijing nanjing] 12345678}

可以看到,map已经成功转换成struct,并且实现了下划线命名字段到驼峰式命名字段之间的赋值

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gongjiwei/article/details/108132077

智能推荐

Height Fog_heightfogglobal-程序员宅基地

文章浏览阅读3.8k次。Height FogOverviewVersionsUsing Height FogHeight Fog PropertiesAnimating Height FogColorInteraction with transparencyPerformance implicationsVolumetric FogExponential Height FogPerform_heightfogglobal

LeetCode-1351. 统计有序矩阵中的负数_JavaScript_1351. 统计有序矩阵中的负数 js-程序员宅基地

文章浏览阅读121次。给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。请你统计并返回 grid 中 负数 的数目。示例 1:输入:grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]输出:8解释:矩阵中共有 8 个负数。示例 2:输入:grid = [[3,2],[1,0]]输出:0示例 3:输入:grid = [[1,-1],[-1,-1]]输出:3示例 4:输入:grid.._1351. 统计有序矩阵中的负数 js

Python学习笔记(三) 数据库连接-程序员宅基地

文章浏览阅读288次。Python学习笔记(三) 数据库连接数据库连接先需要安装依赖 pip install PyMySQL ,如果你还未设置python依赖下载的全局镜像,请跳转至测试数据连接使用importpymysql#创建数据库连接db=pymysql.connect("192.168.10.112","xiongchao","xiongchao","xiongchao")#使用cursor..._cursor.excuse

JAVA使用freemarker根据模板导出Word文档_freemarker 模版导出word 图片占位符如何写-程序员宅基地

文章浏览阅读414次。`j org.freemarker freemarker 2.3.24-incubating ava_freemarker 模版导出word 图片占位符如何写

PlacingFoliageonCesiumTilesets_译_cesium waterplugin-程序员宅基地

文章浏览阅读272次。PlacingFoliageonCesiumTilesets_译UnrealEngine的FoliageTool在像CesiumWorldTerrain的Cesium3D瓦片集上运行。在这个教程,你会学到怎样使用这个工具放置植物或者其他格网。你会学到怎样:1)使用植被工具和Cesium数据集创建葱郁的世界。2)确保放置的植被待在位置上,即使你改变地理参考。!)这是一个基于先前入门教程的想法的中级项目。如果你还没有读过这些,我们建议你在开始这个项目之前复习一下。一个好的开始是CesiumforUn_cesium waterplugin

【UE427数据可视化】——WebBrowser控件_ue4 c++ webbrowser-程序员宅基地

文章浏览阅读1k次。【UE427数据可视化】——WebBrowser控件。_ue4 c++ webbrowser

随便推点

NoSQL对比:Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase vs Neo4j_cassandrav1.1.1-程序员宅基地

文章浏览阅读3.2k次。原文自:http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redisCassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase vs Neo4jWhile SQL databases are insanely useful tools, their monopoly_cassandrav1.1.1

零日漏洞 | 微软披露最新 Windows Print Spooler 远程代码执行漏洞(CVE-2021-34527)_远程命令执行漏洞(cve-2021-34527)-程序员宅基地

文章浏览阅读1.2k次。​点击上方 订阅话题 第一时间了解漏洞威胁0x01 漏洞描述Windows Print Spooler是Windows的打印机后台处理程序,广泛的应用于各种内网中。360漏洞云监测到微软最新披露了一个新的Windows Print Spooler远程代码执行漏洞(CVE-2021-34527),微软已知该漏洞存在在野利用。该漏洞目前为零日状态,微软暂未发布修复。该漏洞源于Windows Print Spooler服务执行特权文件操作不当,攻击者可利用该漏洞以系统权限运行任意代码。攻击者可以安装_远程命令执行漏洞(cve-2021-34527)

新建SpringBoot + MyBatis-Plus项目_新建spring boot mybatis-plus项目-程序员宅基地

文章浏览阅读1.3k次。新建SpringBoot + MyBatis-Plus项目首先使用idea新建SpringBoot[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4vpbYRCZ-1579060750966)(C:\Users\Leven\AppData\Roaming\Typora\typora-user-images\image-20200115112004851.png)..._新建spring boot mybatis-plus项目

Linux内核与Windows内核-程序员宅基地

文章浏览阅读199次。Windows 和 Linux 可以说是我们比较常见的两款操作系统。Windows 基本占领了电脑时代的市场,商业上取得了很大成功,但是它并不开源,所以要想接触源码得加入 Windows 的开发团队中。对于服务器使用的操作系统基本上都是 Linux,而且内核源码也是开源的,任何人都可以下载,并增加自己的改动或功能,Linux 最大的魅力在于,全世界有非常多的技术大佬为它贡献代码。这两个操作系统各有千秋,不分伯仲。操作系统核心的东西就是内核,这次我们就来看看,Linux 内核和 Windows

C++算法学习(力扣:面试题 16.04. 井字游戏)_井字棋c++判断输赢-程序员宅基地

文章浏览阅读1k次。设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符" ",“X"和"O"组成,其中字符” "代表一个空位。以下是井字游戏的规则:玩家轮流将字符放入空位(" “)中。第一个玩家总是放字符"O”,且第二个玩家总是放字符"X"。"X"和"O"只允许放置在空位中,不允许对已放有字符的位置进行填充。当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。当所有位置非空时,也算为游戏结束。如果游戏结束,玩家不允许再放置字符。如果游戏存在获胜者_井字棋c++判断输赢

[PWN] BUUCTF ciscn_2019_s_3-程序员宅基地

文章浏览阅读470次。记Ciscn_2019_s_3的调试过程步骤payload参考wp步骤按照惯例先checksec用64位ida打开发现main中只要一个关键函数vuln,以及发现有gadgets函数记录vuln地址:0x4004ED分析vuln发现进行了系统调用,一个是sys_read,一个是sys_write调用号:sys_read 的调用号 为 0 ;sys_write 的调用号 为 1;记录syscall地址:0x400501或0x400517图中分别给read的三个参数赋值0,&buf,_buuctf ciscn_2019_s_3

推荐文章

热门文章

相关标签