W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
?gconv.Map
?支持將任意的?map
?或?struct/*struct
?類型轉(zhuǎn)換為常用的 ?map[string]interface{}
? 類型。當(dāng)轉(zhuǎn)換參數(shù)為?struct/*struct
?類型時,支持自動識別?struct
?的 ?c/gconv/json
? 標(biāo)簽,并且可以通過?Map
?方法的第二個參數(shù)?tags
?指定自定義的轉(zhuǎn)換標(biāo)簽,以及多個標(biāo)簽解析的優(yōu)先級。如果轉(zhuǎn)換失敗,返回?nil
?。
屬性標(biāo)簽:當(dāng)轉(zhuǎn)換?struct/*struct
?類型時,支持 ?c/gconv/jso
?n 屬性標(biāo)簽,也支持 ?-
?及?omitempty
標(biāo)簽屬性。當(dāng)使用 ?-
? 標(biāo)簽屬性時,表示該屬性不執(zhí)行轉(zhuǎn)換;當(dāng)使用 ?omitempty
標(biāo)簽屬性時,表示當(dāng)屬性為空時(空指針?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)換,即會遞歸轉(zhuǎn)換屬性中的?struct/*struct
?對象。
更多的map相關(guān)轉(zhuǎn)換方法請參考接口文檔: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"`
}
// 對象
g.Dump(gconv.Map(User{
Uid: 1,
Name: "john",
}))
// 對象指針
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
}
我們可以通過?c/gconv/json
標(biāo)簽來自定義轉(zhuǎn)換后的?map
?鍵名,當(dāng)多個標(biāo)簽存在時,按照?gconv/c/json
?的標(biāo)簽順序進(jìn)行優(yōu)先級識別。
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"
}
此外,我們也可以給?struct
?的屬性自定義自己的標(biāo)簽名稱,并在?map
?轉(zhuǎn)換時通過第二個參數(shù)指定標(biāo)簽優(yōu)先級。
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
}
當(dāng)參數(shù)為?map/struct/*struct
?類型時,如果鍵值/屬性為一個對象(或者對象指針)時,并且不是?embedded
?結(jié)構(gòu)體且沒有任何的別名標(biāo)簽綁定,?Map
?方法將會將對象轉(zhuǎn)換為結(jié)果的一個鍵值。我們可以使用?MapDeep
?方法遞歸轉(zhuǎn)換參數(shù)的子對象,即把屬性也轉(zhuǎn)換為?map
?類型。我們來看個例子。
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 {}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: