当前位置:   article > 正文

Golang转换Struct 至 map[string]interface{}_golang any转struct

golang any转struct

本文介绍Golang转换Struct 至 map[string]interface{},包括默认方法的缺陷以及如何通过其他方法实现。

常规方法问题

Go通常使用struct存储数据,如存储用户信息,可能定义下面结构体:

type UserInfo struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
  • 1
  • 2
  • 3
  • 4

要把结构体变量转为map[string]interface{},我们可以使用json序列化方法。

func TestStructToInterface1(t *testing.T) {
	u1 := UserInfo{Name: "q1mi", Age: 18}

	b, _ := json.Marshal(&u1)
	var m map[string]interface{}
	_ = json.Unmarshal(b, &m)
	for k, v := range m{
		fmt.Printf("key:%v value:%v type:%T\n", k, v, v )
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

输出结果:

=== RUN   TestStructToInterface1
key:age value:18 type:float64
key:name value:q1mi type:string
--- PASS: TestStructToInterface1 (0.00s)
  • 1
  • 2
  • 3
  • 4

看起来正常,但却有个问题。Go默认json包序列化数值类型(integer,float等)为float64,并不是int类型。这显然不是我们期望的,下面我们利用第三方包规避该问题。

structs库实现转换

structs官方地址:https://github.com/fatih/structs.
使用之前先安装包:go get github.com/fatih/structs

func TestStructToInterface2(t *testing.T)  {
	u1 := UserInfo{Name: "q1mi", Age: 18}
	m3 := structs.Map(&u1)
	for k, v := range m3 {
		fmt.Printf("key:%v value:%v value type:%T\n", k, v, v)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出结果:

=== RUN   TestStructToInterface2
key:Name value:q1mi value type:string
key:Age value:18 value type:int
--- PASS: TestStructToInterface2 (0.00s)
PASS
  • 1
  • 2
  • 3
  • 4
  • 5

structs 还有很多其他使用示例,读者可以查看文档,该包目前处于不维护状态。

structs转换嵌套结构

我们定义带嵌套类型机构:

type UserInfo struct {
	Name string `json:"name" structs:"name"`
	Age  int    `json:"age" structs:"age"`
	Profile `json:"profile" structs:"profile"`
}

// Profile

type Profile struct {
	Hobby string `json:"hobby" structs:"hobby"`
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

测试转换:

func TestStructToInterface3(t *testing.T)  {
	u1 := UserInfo{Name: "q1mi", Age: 18, Profile: Profile{"Two Color Ball"}}
	m3 := structs.Map(&u1)
	for k, v := range m3 {
		fmt.Printf("key:%v value:%v value type:%T\n", k, v, v)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出结果:

=== RUN   TestStructToInterface3
key:name value:q1mi value type:string
key:age value:18 value type:int
key:profile value:map[hobby:Two Color Ball] value type:map[string]interface {}
--- PASS: TestStructToInterface3 (0.00s)
PASS
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我们看到嵌套结构被映射为 map[string]interface {}类型。

总结

本文介绍json序列化的问题,并引用第三方包struts实现并解决。另外我们也可以通过反射进行实现。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/907879
推荐阅读
相关标签
  

闽ICP备14008679号