技术标签: go go map转换struct go学习 go map转struct结构
可以通过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、结构体中所有字段名必须以大写字母开头,否则将无法赋值
可以通过序列化和反序列化操作将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,并且实现了下划线命名字段到驼峰式命名字段之间的赋值
文章浏览阅读3.8k次。Height FogOverviewVersionsUsing Height FogHeight Fog PropertiesAnimating Height FogColorInteraction with transparencyPerformance implicationsVolumetric FogExponential Height FogPerform_heightfogglobal
文章浏览阅读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
文章浏览阅读288次。Python学习笔记(三) 数据库连接数据库连接先需要安装依赖 pip install PyMySQL ,如果你还未设置python依赖下载的全局镜像,请跳转至测试数据连接使用importpymysql#创建数据库连接db=pymysql.connect("192.168.10.112","xiongchao","xiongchao","xiongchao")#使用cursor..._cursor.excuse
文章浏览阅读414次。`j org.freemarker freemarker 2.3.24-incubating ava_freemarker 模版导出word 图片占位符如何写
文章浏览阅读272次。PlacingFoliageonCesiumTilesets_译UnrealEngine的FoliageTool在像CesiumWorldTerrain的Cesium3D瓦片集上运行。在这个教程,你会学到怎样使用这个工具放置植物或者其他格网。你会学到怎样:1)使用植被工具和Cesium数据集创建葱郁的世界。2)确保放置的植被待在位置上,即使你改变地理参考。!)这是一个基于先前入门教程的想法的中级项目。如果你还没有读过这些,我们建议你在开始这个项目之前复习一下。一个好的开始是CesiumforUn_cesium waterplugin
文章浏览阅读1k次。【UE427数据可视化】——WebBrowser控件。_ue4 c++ webbrowser
文章浏览阅读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
文章浏览阅读1.2k次。点击上方 订阅话题 第一时间了解漏洞威胁0x01 漏洞描述Windows Print Spooler是Windows的打印机后台处理程序,广泛的应用于各种内网中。360漏洞云监测到微软最新披露了一个新的Windows Print Spooler远程代码执行漏洞(CVE-2021-34527),微软已知该漏洞存在在野利用。该漏洞目前为零日状态,微软暂未发布修复。该漏洞源于Windows Print Spooler服务执行特权文件操作不当,攻击者可利用该漏洞以系统权限运行任意代码。攻击者可以安装_远程命令执行漏洞(cve-2021-34527)
文章浏览阅读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项目
文章浏览阅读199次。Windows 和 Linux 可以说是我们比较常见的两款操作系统。Windows 基本占领了电脑时代的市场,商业上取得了很大成功,但是它并不开源,所以要想接触源码得加入 Windows 的开发团队中。对于服务器使用的操作系统基本上都是 Linux,而且内核源码也是开源的,任何人都可以下载,并增加自己的改动或功能,Linux 最大的魅力在于,全世界有非常多的技术大佬为它贡献代码。这两个操作系统各有千秋,不分伯仲。操作系统核心的东西就是内核,这次我们就来看看,Linux 内核和 Windows
文章浏览阅读1k次。设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符" ",“X"和"O"组成,其中字符” "代表一个空位。以下是井字游戏的规则:玩家轮流将字符放入空位(" “)中。第一个玩家总是放字符"O”,且第二个玩家总是放字符"X"。"X"和"O"只允许放置在空位中,不允许对已放有字符的位置进行填充。当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。当所有位置非空时,也算为游戏结束。如果游戏结束,玩家不允许再放置字符。如果游戏存在获胜者_井字棋c++判断输赢
文章浏览阅读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