GoFrameWeb_Demo-3

文章介绍了Go语言库gmeta如何用于在结构体中嵌入元数据,并通过Data和Get方法动态获取。此外,展示了在API接口设计中,如何利用gmeta定义请求和响应数据结构,包括接口路径、标签和MIME类型。还提到了genservice命令用于自动生成服务接口代码,以及gconv.Map组件在转换map和struct类型时的作用。
摘要由CSDN通过智能技术生成

–元数据 - 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

----设计目标

  1. 增加logic分类目录,将所有业务逻辑代码迁移到logic分类目录下,采用包管理形式来管理业务模块。
  2. 业务模块之间的依赖通过接口化解耦,将原有的service分类调整为接口目录。这样每个业务模块将会各自维护、更加灵活。
  3. 可以按照一定的项目规范,从logic业务逻辑代码生成service接口定义代码。同时,也允许人工维护这部分service接口。

----命令使用

作用:该命令通过分析给定logic业务逻辑模块目录下的代码,自动生成service目录接口代码。

  1. 由于该命令是根据业务模块生成service接口,因此只会解析二级目录下的go代码文件,并不会无限递归分析代码文件。以logic目录为例,该命令只会解析logic/xxx/*.go文件。因此,需要logic层代码结构满足一定规范。
  2. 不同业务模块中定义的结构体名称在生成的service接口名称时可能会重复覆盖,因此需要在设计业务模块时保证名称不能冲突。

插播一个组件—Map转换

gconv.Map支持将任意的mapstruct/*struct类型转换为常用的 map[string]interface{} 类型。

当转换参数为struct/*struct类型时,支持自动识别structc/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"`
}

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值