热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golangstruct转map及map*Struct初始化和遍历

funcStruct2Map(objinterface{})map[string]interface{}{t:=reflect.TypeOf(obj)v:=r

func Struct2Map(obj interface{}) map[string]interface{} {
t := reflect.TypeOf(obj)
v := reflect.ValueOf(obj)
var data = make(map[string]interface{})
//func (v Value) NumField() int, 返回v持有的结构体类型值的字段数,如果v的Kind不是Struct会panic
for i := 0; i t.NumField(); i++ {
data[t.Field(i).Name] = v.Field(i).Interface()
}
return data
//结构体转map方法2
func StructToMapViaJson(data S) map[string]interface{} {
m := make(map[string]interface{})
//struct 转json
j, _ := json.Marshal(data)
//json 转map
json.Unmarshal(j, m)
return m
func FillStruct(data map[string]interface{}, obj interface{}) error {
for k, v := range data {
//fmt.Println( k: , k, v: , v)
err := SetField(obj, k, v)
if err != nil {
return err
}
}
return nil
func SetField(obj interface{}, k string, v interface{}) error {
//结构体属性值
structValue := reflect.ValueOf(obj).Elem()
//fmt.Println( structValue: , structValue)
//结构体单个属性值
structFieldValue := structValue.FieldByName(k)
//fmt.Println( structFieldValue: , structFieldValue)
if !structFieldValue.IsValid() {
return fmt.Errorf( No such field: %s in obj , k)
}
if !structFieldValue.CanSet() {
return fmt.Errorf( Cannot set %s field value , k)
}
//结构体属性类型
structFieldType := structFieldValue.Type()
val := reflect.ValueOf(v)
var err error
if structFieldType != val.Type() {
//类型转换
val, err = TypeConversion(fmt.Sprintf( %v , v), structFieldValue.Type().Name())
if err != nil {
return err
}
}
structFieldValue.Set(val)
return nil
func TypeConversion(value string, ntype string) (reflect.Value, error) {
fmt.Println( call TypeConversion... )
if ntype == string {
return reflect.ValueOf(value), nil
} else if ntype == time.Time {
t, err := time.ParseInLocation( 2006-01-02 15:04:05 , value, time.Local)
return reflect.ValueOf(t), err
} else if ntype == Time {
t, err := time.ParseInLocation( 2006-01-02 15:04:05 , value, time.Local)
return reflect.ValueOf(t), err
} else if ntype == int {
i, err := strconv.Atoi(value)
return reflect.ValueOf(i), err
} else if ntype == int8 {
i, err := strconv.ParseInt(value, 10, 64)
return reflect.ValueOf(int8(i)), err
} else if ntype == int32 {
i, err := strconv.ParseInt(value, 10, 64)
return reflect.ValueOf(int64(i)), err
} else if ntype == int64 {
i, err := strconv.ParseInt(value, 10, 64)
return reflect.ValueOf(i), err
} else if ntype == float32 {
i, err := strconv.ParseFloat(value, 64)
return reflect.ValueOf(float32(i)), err
} else if ntype == float64 {
i, err := strconv.ParseFloat(value, 64)
return reflect.ValueOf(i), err
//else if .......增加其他一些类型的转换
return reflect.ValueOf(value), errors.New( 未知的类型: + ntype)
func main() {
var s S
Types := reflect.TypeOf(s)
//TypeData.FieldByIndex([]int{}) 返回 StructField
//[]int{}参数: 第一个是struct类型的索引(如果索引为参数一的数据类型不是struct会报错), 第二个是索引为参数一的结构体内属性的索引
//例如[]int{0,0} 会输出[0] a string,表示索引为0的结构体User内索引为0的数据是a
//[]int{0, 1} 会输出[1] b string
//[]int{1, 0}会报错, 因为索引为1的数据是S结构体中的数据 Name string,数据类型不是struct
res := Types.FieldByIndex([]int{0, 0})
fmt.Println( FieldByIndex: , res.Index, res.Name, res.Type)
//struct to map
info := S{Name: xsk , Age: 22, Address: shanghai }
data := Struct2Map(info)
fmt.Println( data: , data, , typeof(data): , reflect.TypeOf(data))
for k, v := range data {
fmt.Println(k, v.(interface{}))
}
fmt.Println( --------- )
data1 := StructToMapViaJson(info)
fmt.Println( data1: , data1, , typeof(data1): , reflect.TypeOf(data1))
for k, v := range data1 {
fmt.Println(k, v.(interface{}))
}
fmt.Println( --------- )
//map to struct
data2 := make(map[string]interface{})
data2[ Name ] = xsk
data2[ Age ] = 22
data2[ Address ] = shanghai
result := S{}
err := FillStruct(data2, result)
fmt.Println( err: , err, result: , fmt.Sprintf( %+v , *result))
fmt.Println( --------- )
//map[string]*Struct 下面几种初始化都行
//第一种
//var info1 = map[string]*S{ info : S{Name: mtt , Age: 23, Address: shanghai }}
//第二种
var info1 = map[string]*S{ info : S{}, other : S{}}
info1[ info ].Name = mtt
info1[ info ].Age = 23
info1[ info ].Address = shanghai
fmt.Println( info1: , *info1[ info ])
t := reflect.TypeOf(*info1[ info ])
v := reflect.ValueOf(*info1[ info ])
for k := 0; k t.NumField(); k++ {
fmt.Printf( %s: %v\n , t.Field(k).Name, v.Field(k).Interface())
}
fmt.Println( --------- )
//第三种
var info2 = map[string]*S{}
info2[ info ] = S{Name: xly , Age: 1, Address: shanghai }
fmt.Println( info2: , *info2[ info ])
ty := reflect.TypeOf(*info2[ info ])
vl := reflect.ValueOf(*info2[ info ])
for k := 0; k ty.NumField(); k++ {
fmt.Printf( %s: %v\n , ty.Field(k).Name, vl.Field(k).Interface())
}



golang 中 map 转 struct

package main
import (
fmt
github.com/goinggo/mapstructure
type Person struct {
Name string
Age int
func MapToStruct() {
mapInstance := make(map[string]interface{})
mapInstance[ Name ] = liang637210
mapInstance[ Age ] = 28
var person Person
//将 map 转换为指定的结构体
if err := mapstructure.Decode(mapInstance, person); err != nil {
fmt.Println(err)
}
fmt.Printf( map2struct后得到的 struct 内容为:%v , person)
func main(){
MapToStruct()
}


   



推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
author-avatar
mobiledu2502872577
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有