博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Golang 接口自动化07】struct转map的三种方式
阅读量:4924 次
发布时间:2019-06-11

本文共 1879 字,大约阅读时间需要 6 分钟。

背景

我们在前面介绍过怎么使用net/http发送json或者map数据,那么它能不能直接发送结构体数据呢?我们今天一起来学习结构体struct转map的三种方法,为后续做铺垫。

struct转map

使用json模块

直接使用json.Marshal方法来强制转化struct。

参考代码:

func JSONMethod(content interface{}) map[string]interface{} {    var name map[string]interface{}    if marshalContent, err := json.Marshal(content); err != nil {        fmt.Println(err)    } else {        d := json.NewDecoder(bytes.NewReader(marshalContent))        d.UseNumber() // 设置将float64转为一个number        if err := d.Decode(&name); err != nil {            fmt.Println(err)        } else {            for k, v := range name {                name[k] = v            }        }    }    return name}

使用reflect模块

通过reflect模块来获取结构体的key值和value值,然后直接进行组装。这种方法不能识别结构体中的tag,所以无法兼容首字母小写,而其他字母存在大写的情况.

参考代码:

func ReflectMethod(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[strings.ToLower(t.Field(i).Name)] = v.Field(i).Interface()    }    return data}

使用第三方库

第三种方法是使用第三方库github.com/fatih/structs,他提供了比较丰富的函数,让我们可以像python中一样轻松的获取所有的key值(structs.Names(server)),所有的value值(structs.Values(server)),甚至直接进行类型判断(structs.IsZero(server))等等。

更详细的信息可以查阅:

测试

type Human struct {    Name     string `json:"name"`    Age      int    `json:"age"`    Profile  string `structs:"profile"`    IsGopher bool   `json:"isGopher"`}func main() {    human := Human{"Detector", 18, "A tester", true}    fmt.Println("Json method:", JSONMethod(human))    fmt.Println("========")    fmt.Println("Reflect method:", ReflectMethod(human))    fmt.Println("========")    fmt.Println("Third lb:", structs.Map(human))}

输出如下:

1172048-20181017195218396-1442195765.png

总结

从测试结果可以看到,三种方式都能完成struct转map,但是reflect方法无法识别结构体中的tag,第三方库只能使用tag structs,所以如果考虑兼容性(考虑到协同开发)和尽量使用官方库的原则,推荐使用第一种方法(json转换)。

  • reflect.Field
  • json
  • structs

转载于:https://www.cnblogs.com/Detector/p/9746284.html

你可能感兴趣的文章
搭建交叉调试环境 arm-linux-gdb配合gdbserver
查看>>
使用Jsoup 抓取页面的数据
查看>>
使用命令批量对文件中出现的字符串进行替换
查看>>
C#获取URL参数值
查看>>
oracle extract 函数简介
查看>>
JVM——参数设置、分析
查看>>
Struts 框架 之 文件上传下载案例
查看>>
【重走Android之路】【路线篇(二)】知识点归纳
查看>>
graphviz入门
查看>>
JAVA编码(37)—— Java字符串转换为MAP对象
查看>>
jquery.validate.js 一个jQuery验证格式控件
查看>>
有表格的九九乘法表
查看>>
WPF 4 DataGrid 控件(自定义样式篇)
查看>>
改善C#程序的建议1:非用ICloneable不可的理由
查看>>
PHP的错误机制总结
查看>>
SharePoint 2013 工作流设计之Designer 使用“可视化视图”
查看>>
window.location
查看>>
C#实现万年历(农历、节气、节日、星座、星宿、属相、生肖、闰年月、时辰)
查看>>
使用Flex图表组件
查看>>
Windows Phone 8初学者开发—第6部分:设置应用程序的样式
查看>>