–元数据 - gmeta
主要用于嵌入到用户自定义的结构体中,并且通过标签的形式给gmeta
包的结构体打上自定义的标签内容(元数据),并在运行时可以特定方法动态获取这些自定义的标签内容。
—Data
方法
Data
方法用于获取指定struct
对象的元数据标签,构成map
返回。
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
对象中指定名称的元数据标签信息。
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
–简单案例—实现MySQL用户的查询
// api -> controller -> logic
api:
package v1
import (
"github.com/gogf/gf/v2/frame/g"
)
// 在数据库中查询,并返回出来
// 定义接口的请求数据结构,描述了客户端在调用接口时所需提供的数据格式和字段(调用接口需要提供的东西)。
type Req struct {
// g.Meta字段
// path:结合注册时的前缀共同构成接口URI路径、tags:接口所属的标签,用于接口分类、
g.Meta `path:"/hello" tags:"Hello" method:"get" summary:"You first hello api"`
Name string `json:"name"`
}
// 定义接口的响应数据结构,在接口调用成功后,返回给客户端的数据格式和字段(我需要给你的东西)。
type Res struct {
// mime 接口的MIME类型,例如multipart/form-data一般是全局设置,默认为application/json。
g.Meta `mime:"text/html" example:"string"`
ImageUrl string `json:"image_url"`
}
controller(接收/解析用户输入参数的入口/接口层):
package hello
import (
"context"
"demo/internal/service"
"fmt"
v1 "demo/api/hello/v1"
)
type Controller struct{}
func New() *Controller {
return &Controller{}
}
// 对请求数据结构进行处理(用户输入参数 : req *v1.Req)
// 得到请求参数,并使用:
// g.Meta `path:"/hello" tags:"Hello" method:"get" summary:"You first hello api"`
//
// Name string `json:"name"`
func (c *Controller) Hello(ctx context.Context, req *v1.Req) (res *v1.Res, err error) {
// 这个输出的应该就是请求的完整url
fmt.Println(req.Name)
// service.User():这是一个服务层的方法调用,用于获取用户服务的实例
// Login(ctx, req.Name):这是调用用户服务中的 Login 方法来进行用户登录操作。其中:ctx 是一个上下文对象,用于传递上下文信息,如请求的上下文环境、超时控制等。
// req.Name 是从请求中获取的用户名,作为登录的参数。
info := service.User().Login(ctx, req.Name)
// 得到用户输入的参数
res = &v1.Res{
ImageUrl: info,
}
return
}
—插播一个指令:gen service
----设计目标
- 增加
logic
分类目录,将所有业务逻辑代码迁移到logic
分类目录下,采用包管理形式来管理业务模块。 - 业务模块之间的依赖通过接口化解耦,将原有的
service
分类调整为接口目录。这样每个业务模块将会各自维护、更加灵活。 - 可以按照一定的项目规范,从
logic
业务逻辑代码生成service
接口定义代码。同时,也允许人工维护这部分service
接口。
----命令使用
作用:该命令通过分析给定的logic
业务逻辑模块目录下的代码,自动生成service
目录接口代码。
- 由于该命令是根据业务模块生成
service
接口,因此只会解析二级目录下的go
代码文件,并不会无限递归分析代码文件。以logic
目录为例,该命令只会解析logic/xxx/*.go
文件。因此,需要logic
层代码结构满足一定规范。- 不同业务模块中定义的结构体名称在生成的
service
接口名称时可能会重复覆盖,因此需要在设计业务模块时保证名称不能冲突。
插播一个组件—Map转换
gconv.Map
支持将任意的map
或struct
/*struct
类型转换为常用的 map[string]interface{}
类型。
当转换参数为struct
/*struct
类型时,支持自动识别struct
的 c/gconv/json
标签,并且可以通过Map
方法的第二个参数tags
指定自定义的转换标签,以及多个标签解析的优先级。如果转换失败,返回nil
。
看文档没看明白~,先了解断言
Go语言里有一个语法,可以直接判断是否是该类型的变量,判断element是否为T类型:value, ok = element.(T)
,这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型。
ch, flag := s.(Chinese) // 看看s能否转成Chinese类型并且赋给ch变量,flag判断是否转成功
// 另一种写法
// ch,flag := s.(Chinese)是对变量的初始化
// flag是对变量的判断
// 前面该怎么着怎么着
if ch,flag := s.(Chinese);flag{
ch.***()
}
logic(业务逻辑封装管理,特定的业务逻辑实现和封装)
package v1
import (
"github.com/gogf/gf/v2/frame/g"
)
// api -> controller -> logic
// 在数据库中查询,并返回出来
// 定义接口的请求数据结构,描述了客户端在调用接口时所需提供的数据格式和字段(调用接口需要提供的东西)。
type Req struct {
// g.Meta字段
// path:结合注册时的前缀共同构成接口URI路径、tags:接口所属的标签,用于接口分类、
g.Meta `path:"/hello" tags:"Hello" method:"get" summary:"You first hello api"`
Name string `json:"name"`
}
// 定义接口的响应数据结构,在接口调用成功后,返回给客户端的数据格式和字段(我需要给你的东西)。
type Res struct {
// mime 接口的MIME类型,例如multipart/form-data一般是全局设置,默认为application/json。
g.Meta `mime:"text/html" example:"string"`
ImageUrl string `json:"image_url"`
}
struct {
// mime 接口的MIME类型,例如multipart/form-data一般是全局设置,默认为application/json。
g.Meta `mime:"text/html" example:"string"`
ImageUrl string `json:"image_url"`
}