golang结构体转map

package main

import (
"encoding/json"
"fmt"
"reflect"
"time"
)

type Body struct {
Person1 string
Age int
Salary float32
}

func Struct2Map(obj interface{}) (data map[string]interface{}, err error) {
data = make(map[string]interface{})
objT := reflect.TypeOf(obj)
objV := reflect.ValueOf(obj)
for i := 0; i < objT.NumField(); i++ {
data[objT.Field(i).Name] = objV.Field(i).Interface()
}
err = nil
return
}

func Test1() {
t := time.Now()
a := Body{"aaa", 2, 12.34}
elem := reflect.ValueOf(&a).Elem()
type_ := elem.Type()
m := map[string]interface{}{}
for i := 0; i < type_.NumField(); i++ {
m[type_.Field(i).Name] = elem.Field(i).Interface()
}
fmt.Println(time.Now().Sub(t), m)
}

func Test2() {
t := time.Now()
persion := Body{"aaa", 2, 12.34}
j, _ := json.Marshal(persion)
fmt.Println(time.Now().Sub(t), string(j))
}

func Test3() {
m := make(map[string]interface{})
t := time.Now()
persion := Body{"aaa", 2, 12.34}
j, _ := json.Marshal(persion)
json.Unmarshal(j, &m)
fmt.Println(time.Now().Sub(t), m)
}

func Test4() {
t := time.Now()
persion := Body{"aaa", 2, 12.34}
ret, _ := Struct2Map(persion)
fmt.Println(time.Now().Sub(t), ret)
}

func main() {
Test1()
Test2()
Test3()
Test4()
}

package main

import (
    "fmt"
    "reflect"
    "time"
)

type User struct {
    Id        int64
    Username  string
    Password  string
    Logintime time.Time
}

func Struct2Map(obj interface{}) map[string]interface{} {
    t := reflect.TypeOf(obj)
    v := reflect.ValueOf(obj)

    var data = make(map[string]interface{})
    for i := 0; i < t.NumField(); i++ {
        data[t.Field(i).Name] = v.Field(i).Interface()
    }
    return data
}

func main() {
    user := User{5, "zhangsan", "pwd", time.Now()}
    data := Struct2Map(user)
    fmt.Println(data)
}

原文地址:http://blog.51cto.com/13187574/2083961

时间: 2024-11-12 09:24:19

golang结构体转map的相关文章

golang 结构体中的匿名接口

golang 结构体中的匿名接口 代码示例 golang 中,可以给结构体增加匿名field,可参考 unknwon 大神的书. 匿名字段和内嵌结构体 但,golang同时也可以给结构体定义一个匿名interface field,用法: 标准库 sort 中,有下面的写法: type Interface interface { Len() int Less(i, j int) bool Swap(i, j int) } type reverse struct { Interface } func

golang 结构体笔记

一.概念 结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体.每个值称为结构体的成员. 二.结构体声明及使用 // 声明结构体 type Employee struct { ID int Name string } func main() { // 结构体实例化 emp := Employee{ID: 1, Name: "Frod"} // 匿名字段实例化 emp2 := Employee{1, "Frod2"} fmt.Println(emp) f

golang结构体json的时间格式化解决方案

最近开发项目时候发现一个结构体的Json转换的时间格式问题. 即这种1993-01-01T20:08:23.000000028+08:00 这种表示UTC方法.从我们习惯来说,更喜欢希望的是 1993-01-01 20:08:23这种格式. 重新复现代码如下: package main import (     "time"     "encoding/json" ) type Student struct {     Name string     `json:&

Golang 结构体(struct)

前言 编程就是要通过编程语言表达给计算机,让计算机帮助我们达到解决现实生活问题的目的! 不管是Python还是Golang...这些编程语言,由于历史原因.遇到的痛点.解决的问题不同,导致语法追求.本身特性不同.但是遇到的问题.解决问题的思想是一致的. 如果想要开发1款游戏,游戏中的人物不仅有角色属性.也有交易.攻击这些作为. 单纯得使用数据类型int.string ..函数去表示1个人物,复杂不利于代码灵活.扩展,于是想办法如何把数据和方法集合到1块进行表示. Go语言中没有“类”的概念,也不

golang 结构体的嵌入类型和接口

结构体的嵌入类型 1.嵌入结构体1 package main import "fmt" type Person struct { name string } type Student struct { class int person Person         //定义person 类型为Person } func main(){ s := Student{1,Person{"xiaoming"}} fmt.Println("name :",

golang 结构体嵌入和匿名成员

考虑一个二维的绘图程序,提供了一个各种图形的库,例如矩形.椭圆形.星形和轮形等几 何形状.这里是其中两个的定义 type Circle struct { X, Y, Radius int } type Wheel struct { X, Y, Radius, Spokes int } 一个Circle代表的圆形类型包含了标准圆心的X和Y坐标信息,和一个Radius表示的半径信 息.一个Wheel轮形除了包含Circle类型所有的全部成员外,还增加了Spokes表示径向辐条的 数量.我们可以这样创

[Go] golang结构体成员与函数类型

package main import ( "fmt" ) //定义一个类型 type tsh struct { //定义成员,类型是func() string test func() string } //定义一个函数,获取tsh类型 func New(fn func() string) *tsh { return &tsh{ test: fn, } } func cre() string { return fmt.Sprintf("%s,来了", &qu

Golang 结构体和[]byte相互转换

Golang数据结构与[]byte的相互转换,需要了解两个数据结构具体的底层实现,然后构造相同的数据结构进行转换即可. package main import ( "fmt" "unsafe" ) type Data struct { a,b int32 c map[string]interface{} } type SliceMock struct { addr uintptr len int cap int } func main() { d := Data{

结构体用于map,set时要重载运算符&lt;

#include<iostream> #include<set> using namespace std; struct P { int entry; int time; bool operator<(const P &b)const { return (this->entry<b.entry); } }; int main() { while(!cin.eof()) { int n; cin>>n; set<P> s; P tmp