基本介绍

主要用于嵌入到用户自定义的结构体中,并且通过标签的形式给gmeta包的结构体打上自定义的标签内容(元数据),并在运行时可以特定方法动态获取这些自定义的标签内容。

使用方式:

import "github.com/gogf/gf/v2/util/gmeta"

接口文档

https://pkg.go.dev/github.com/gogf/gf/v2/util/gmeta

方法列表:

func Data(object interface{}) map[string]interface{}
func Get(object interface{}, key string) *gvar.Var

使用示例

Data方法

Data方法用于获取指定struct对象的元数据标签,构成map返回。

package main

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

func main() {
	type User struct {
		gmeta.Meta `orm:"user" db:"mysql"`
		Id         int
		Name       string
	}
	g.Dump(gmeta.Data(User{}))
}

执行后,终端输出:

{
    "db": "mysql",
    "orm": "user"
}

Get方法

Get方法用于获取指定struct对象中指定名称的元数据标签信息。

package main

import (
	"fmt"
	"github.com/gogf/gf/v2/util/gmeta"
)

func main() {
	type User struct {
		gmeta.Meta `orm:"user" db:"mysql"`
		Id         int
		Name       string
	}
	user := User{}
	fmt.Println(gmeta.Get(user, "orm").String())
	fmt.Println(gmeta.Get(user, "db").String())
}

执行后,终端输出:

user
mysql
Content Menu

  • No labels

7 Comments

  1. 这个是做什么用的?弄个demo吧

    1. 感觉就是为了保存一些只读信息用的

    2. 在规范路由里,gmeta 是标配,用来描述接口信息,可以搜到对应的代码看一下增加理解

  2. 前后端分离的话,api也要这样写么,之前写没写过这个

  3. xxxReq struct中定义的 gMeta 信息,可以在 middleware 中读取到吗?


    1. //xxxReq struct 定义 no_auth 信息
      type HelloReq struct {
      	g.Meta `path:"/hello" method:"get" tags:"默认" summary:"欢迎信息" no_auth:"true"`
      }
      
      //中间件中判断
      func NoAuth(r *ghttp.Request) bool {
      	handler := r.GetServeHandler().Handler
      	if handler.Info.Type != nil && handler.Info.Type.NumIn() == 2 {
      		var objectReq = reflect.New(handler.Info.Type.In(1))
      		if v := gmeta.Get(objectReq, "no_auth"); !v.IsEmpty() {
      			return v.Bool()
      		}
      	}
      	return false
      }


      1. 你是读了源码吗,是真的强!