【Golang 接口自动化07】struct转map的三种方式
1.【Golang 接口自动化00】为什么要用Golang做自动化?2.【Golang 接口自动化01】使用标准库net/http发送Get请求3.【Golang 接口自动化02】使用标准库net/http发送Post请求4.【Golang 接口自动化03】 解析接口返回XML5.【Golang 接口自动化04】 解析接口返回JSON串6.【Golang 接口自动化05】使用yml管理自动化用例7.【Golang 接口自动化06】微信支付md5签名计算及其优化
8.【Golang 接口自动化07】struct转map的三种方式
9.【Golang 接口自动化08】使用标准库httptest完成HTTP请求的Mock测试10.【Golang】基于录制,自动生成go test接口自动化用例背景
我们在前面介绍过怎么使用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))等等。
更详细的信息可以查阅:https://github.com/fatih/structs
测试
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))
}
输出如下:
总结
从测试结果可以看到,三种方式都能完成struct转map,但是reflect方法无法识别结构体中的tag,第三方库只能使用tag structs
,所以如果考虑兼容性(考虑到协同开发)和尽量使用官方库的原则,推荐使用第一种方法(json转换)。
- reflect.Field
- json
- structs
文中可能存在描述不正确,欢迎大神们指正补充!
感谢阅读,如果觉得对你有帮助,就在右下角点个赞吧,感谢!
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。
合集:
Golang 接口自动化
分类:
09. Golang
, 03. Golang 接口自动化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律