GoFrame 類型轉(zhuǎn)換-Map轉(zhuǎn)換

2022-03-30 15:37 更新

?gconv.Map?支持將任意的?map?或?struct/*struct?類型轉(zhuǎn)換為常用的 ?map[string]interface{}? 類型。當(dāng)轉(zhuǎn)換參數(shù)為?struct/*struct?類型時(shí),支持自動(dòng)識(shí)別?struct?的 ?c/gconv/json? 標(biāo)簽,并且可以通過(guò)?Map?方法的第二個(gè)參數(shù)?tags?指定自定義的轉(zhuǎn)換標(biāo)簽,以及多個(gè)標(biāo)簽解析的優(yōu)先級(jí)。如果轉(zhuǎn)換失敗,返回?nil?。

屬性標(biāo)簽:當(dāng)轉(zhuǎn)換?struct/*struct?類型時(shí),支持 ?c/gconv/jso?n 屬性標(biāo)簽,也支持 ?-?及?omitempty標(biāo)簽屬性。當(dāng)使用 ?-? 標(biāo)簽屬性時(shí),表示該屬性不執(zhí)行轉(zhuǎn)換;當(dāng)使用 ?omitempty標(biāo)簽屬性時(shí),表示當(dāng)屬性為空時(shí)(空指針?nil?, 數(shù)字?0?, 字符串?""?, 空數(shù)組?[]?等)不執(zhí)行轉(zhuǎn)換。

常用轉(zhuǎn)換方法:

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

其中,?MapDeep?支持遞歸轉(zhuǎn)換,即會(huì)遞歸轉(zhuǎn)換屬性中的?struct/*struct?對(duì)象。

更多的map相關(guān)轉(zhuǎn)換方法請(qǐng)參考接口文檔:https://pkg.go.dev/github.com/gogf/gf/v2/util/gconv

基本示例

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/util/gconv"
)

func main() {
	type User struct {
		Uid  int    `c:"uid"`
		Name string `c:"name"`
	}
	// 對(duì)象
	g.Dump(gconv.Map(User{
		Uid:  1,
		Name: "john",
	}))
	// 對(duì)象指針
	g.Dump(gconv.Map(&User{
		Uid:  1,
		Name: "john",
	}))

	// 任意map類型
	g.Dump(gconv.Map(map[int]int{
		100: 10000,
	}))
}

執(zhí)行后,終端輸出:

{
    "name": "john",
    "uid": 1
}

{
    "name": "john",
    "uid": 1
}

{
    "100": 10000
}

屬性標(biāo)簽

我們可以通過(guò)?c/gconv/json標(biāo)簽來(lái)自定義轉(zhuǎn)換后的?map?鍵名,當(dāng)多個(gè)標(biāo)簽存在時(shí),按照?gconv/c/json?的標(biāo)簽順序進(jìn)行優(yōu)先級(jí)識(shí)別。

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/util/gconv"
)

func main() {
	type User struct {
		Uid      int
		Name     string `c:"-"`
		NickName string `c:"nickname, omitempty"`
		Pass1    string `c:"password1"`
		Pass2    string `c:"password2"`
	}
	user := User{
		Uid:   100,
		Name:  "john",
		Pass1: "123",
		Pass2: "456",
	}
	g.Dump(gconv.Map(user))
}

執(zhí)行后,終端輸出:

{
    "Uid": 100,
    "password1": "123",
    "password2": "456"
}

自定義標(biāo)簽

此外,我們也可以給?struct?的屬性自定義自己的標(biāo)簽名稱,并在?map?轉(zhuǎn)換時(shí)通過(guò)第二個(gè)參數(shù)指定標(biāo)簽優(yōu)先級(jí)。

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/util/gconv"
)

func main() {
	type User struct {
		Id   int    `c:"uid"`
		Name string `my-tag:"nick-name" c:"name"`
	}
	user := &User{
		Id:   1,
		Name: "john",
	}
	g.Dump(gconv.Map(user, "my-tag"))
}

執(zhí)行后,輸出結(jié)果為:

{
	"nick-name": "john",
	"uid": 1
}

遞歸轉(zhuǎn)換

當(dāng)參數(shù)為?map/struct/*struct?類型時(shí),如果鍵值/屬性為一個(gè)對(duì)象(或者對(duì)象指針)時(shí),并且不是?embedded?結(jié)構(gòu)體且沒(méi)有任何的別名標(biāo)簽綁定,?Map?方法將會(huì)將對(duì)象轉(zhuǎn)換為結(jié)果的一個(gè)鍵值。我們可以使用?MapDeep?方法遞歸轉(zhuǎn)換參數(shù)的子對(duì)象,即把屬性也轉(zhuǎn)換為?map?類型。我們來(lái)看個(gè)例子。

package main

import (
	"fmt"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/util/gconv"
	"reflect"
)

func main() {
	type Base struct {
		Id   int    `c:"id"`
		Date string `c:"date"`
	}
	type User struct {
		UserBase Base   `c:"base"`
		Passport string `c:"passport"`
		Password string `c:"password"`
		Nickname string `c:"nickname"`
	}
	user := &User{
		UserBase: Base{
			Id:   1,
			Date: "2019-10-01",
		},
		Passport: "john",
		Password: "123456",
		Nickname: "JohnGuo",
	}
	m1 := gconv.Map(user)
	m2 := gconv.MapDeep(user)
	g.Dump(m1, m2)
	fmt.Println(reflect.TypeOf(m1["base"]))
	fmt.Println(reflect.TypeOf(m2["base"]))
}

執(zhí)行后,終端輸出結(jié)果為:

{
    "base": {
            "Id": 1,
            "Date": "2019-10-01"
    },
    "nickname": "JohnGuo",
    "passport": "john",
    "password": "123456"
}
{
    "base": {
            "date": "2019-10-01",
            "id": 1
    },
    "nickname": "JohnGuo",
    "passport": "john",
    "password": "123456"
}
main.Base
map[string]interface {}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)