Map转换

gconv.Map支持将任意的mapstruct/*struct类型转换为常用的 map[string]interface{} 类型。当转换参数为struct/*struct类型时,支持自动识别structc/gconv/json 标签,并且可以通过Map方法的第二个参数tags指定自定义的转换标签,以及多个标签解析的优先级。如果转换失败,返回nil

属性标签:当转换struct/*struct类型时, c/gconv/json 标签,也支持 -omitempty 标签属性。当使用 - 标签属性时,表示该属性不执行转换;当使用 omitempty 标签属性时,表示当属性为空时(空指针nil, 数字0, 字符串"", 空数组[]等)不执行转换。具体请查看随后示例。

转换方法:

  1. func Map(value interface{}, tags ...string) map[string]interface{}
  2. func MapDeep(value interface{}, tags ...string) map[string]interface{}

其中,MapDeep支持递归转换,即会递归转换属性中的struct/*struct对象。

示例1,基本示例

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/util/gconv"
  5. )
  6. func main() {
  7. type User struct {
  8. Uid int `c:"uid"`
  9. Name string `c:"name"`
  10. }
  11. // 对象
  12. fmt.Println(gconv.Map(User{
  13. Uid : 1,
  14. Name : "john",
  15. }))
  16. // 对象指针
  17. fmt.Println(gconv.Map(&User{
  18. Uid : 1,
  19. Name : "john",
  20. }))
  21. // 任意map类型
  22. fmt.Println(gconv.Map(map[int]int{
  23. 100 : 10000,
  24. }))
  25. }

执行后,输出结果如下:

  1. map[uid:1 name:john]
  2. map[uid:1 name:john]
  3. map[100:10000]

示例2,属性标签

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/util/gconv"
  5. )
  6. func main() {
  7. type User struct {
  8. Uid int
  9. Name string `c:"-"`
  10. NickName string `c:"nickname, omitempty"`
  11. Pass1 string `c:"password1"`
  12. Pass2 string `c:"password2"`
  13. }
  14. user := User{
  15. Uid : 100,
  16. Name : "john",
  17. Pass1 : "123",
  18. Pass2 : "456",
  19. }
  20. fmt.Println(gconv.Map(user))
  21. }

执行后,输出结果为:

  1. map[Uid:100 password1:123 password2:456]

示例3,自定义标签

  1. package main
  2. import (
  3. "github.com/gogf/gf/frame/g"
  4. "github.com/gogf/gf/util/gconv"
  5. )
  6. func main() {
  7. type User struct {
  8. Id int `c:"uid"`
  9. Name string `my-tag:"nick-name" c:"name"`
  10. }
  11. user := &User{
  12. Id: 1,
  13. Name: "john",
  14. }
  15. g.Dump(gconv.Map(user, "my-tag"))
  16. }

执行后,输出结果为:

  1. {
  2. "nick-name": "john",
  3. "uid": 1
  4. }

示例4,递归转换

当参数为map/struct/*struct类型时,如果键值/属性为一个对象(或者对象指针)时,Map方法将会将对象转换为结果的一个键值。我们可以使用MapDeep方法递归转换参数的子对象。

使用示例:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/util/gconv"
  5. )
  6. func main() {
  7. type Base struct {
  8. Id int `c:"id"`
  9. CreateTime string `c:"create_time"`
  10. }
  11. type User struct {
  12. Base `c:"base"`
  13. Passport string `c:"passport"`
  14. Password string `c:"password"`
  15. Nickname string `c:"nickname"`
  16. }
  17. user := new(User)
  18. user.Id = 1
  19. user.Nickname = "John"
  20. user.Passport = "johng"
  21. user.Password = "123456"
  22. user.CreateTime = "2019"
  23. fmt.Println(gconv.Map(user))
  24. fmt.Println(gconv.MapDeep(user))
  25. }

执行后,终端输出结果为:

  1. map[base:{1 2019} nickname:John passport:johng password:123456]
  2. map[create_time:2019 id:1 nickname:John passport:johng password:123456]