大庆小程序制作,网站排名优化电话,沈阳网站推广优化,外企网站建设公司排名目录
背景
struct转map
使用json模块
使用reflect模块
使用第三方库
测试
总结
资料获取方法 背景
我们在前面介绍过怎么使用net/http发送json或者map数据#xff0c;那么它能不能直接发送结构体数据呢#xff1f;我们今天一起来学习结构体struct转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转为一个numberif 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:nameAge int json:ageProfile string structs:profileIsGopher 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.Fieldjsonstructs 资料获取方法
【留言777】 各位想获取源码等教程资料的朋友请点赞 评论 收藏三连
三连之后我会在评论区挨个私信发给你们~