• Map转换
    • 示例1,基本示例
    • 示例2,属性标签
    • 示例3,自定义标签
    • 示例4,递归转换

    Map转换

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

    注意:默认情况下,当属性中两个标签 gconvjson 同时存在时,gconv标签的优先级更高。

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

    转换方法:

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

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

    示例1,基本示例

    1. package main
    2. import (
    3. "fmt"
    4. "github.com/gogf/gf/g/util/gconv"
    5. )
    6. func main() {
    7. type User struct {
    8. Uid int `json:"uid"`
    9. Name string `json:"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/g/util/gconv"
    5. )
    6. func main() {
    7. type User struct {
    8. Uid int
    9. Name string `gconv:"-"`
    10. NickName string `gconv:"nickname, omitempty"`
    11. Pass1 string `gconv:"password1"`
    12. Pass2 string `gconv:"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. }

    示例中可以使用gconv标签,也使用json标签。执行后,输出结果为:

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

    示例3,自定义标签

    1. package main
    2. import (
    3. "github.com/gogf/gf/g"
    4. "github.com/gogf/gf/g/util/gconv"
    5. )
    6. func main() {
    7. type User struct {
    8. Id int `json:"uid"`
    9. Name string `my-tag:"nick-name" json:"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. "github.com/gogf/gf/g"
    4. "github.com/gogf/gf/g/util/gconv"
    5. )
    6. func main() {
    7. type Ids struct {
    8. Id int `json:"id"`
    9. Uid int `json:"uid"`
    10. }
    11. type Base struct {
    12. Ids
    13. CreateTime string `json:"create_time"`
    14. }
    15. type User struct {
    16. Base
    17. Passport string `json:"passport"`
    18. Password string `json:"password"`
    19. Nickname string `json:"nickname"`
    20. }
    21. user := new(User)
    22. user.Id = 1
    23. user.Uid = 100
    24. user.Nickname = "John"
    25. user.Passport = "johng"
    26. user.Password = "123456"
    27. user.CreateTime = "2019"
    28. g.Dump(gconv.MapDeep(user))
    29. }

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

    1. {
    2. "create_time": "2019",
    3. "id": 1,
    4. "nickname": "John",
    5. "passport": "johng",
    6. "password": "123456",
    7. "uid": 100
    8. }