Controller层
涉及文件夹 :internal
下的 controller
文件夹和 api
文件夹
api 文件夹
在 api
文件夹下创建 hi/v1
文件夹,并在 v1
文件夹下创建v1
文件夹,v_
指的是该api的版本号
目录结构如下:
├── api │ ├── hi │ │ ├── v1 │ │ │ ├── hi.go
在hi.go中添加需要的请求结构体和响应结构体,命名与规范路由的写法一致,请求以Req结尾,响应以Res结尾。注:首字母需要大写,不然其他包访问不了会爆红。
package v1
import "github.com/gogf/gf/v2/frame/g"
type HiReq struct {
g.Meta `path:"/hi" method:"get"`
}
type HiRes struct {
Msg string
}
controller文件夹
在 api
中写入请求结构体与响应结构体后,可以用 GoFrame
框架的代码生成工具 gen
快速生成 controller
文件。
在终端中输入指令
gf gen ctrl
可以看到生成了四个文件。
进入 hi_v1_hi.go
文件, 在方法中添加具体实现的代码
package hi
import (
"context"
"demo/api/hi/v1"
)
func (c *ControllerV1) Hi(ctx context.Context, req *v1.HiReq) (res *v1.HiRes, err error) {
res = &v1.HiRes{
"hi",
}
return
}
自动生成的 hi_new.go
文件含有获取接口实现的函数,可以在 cmd.go
中进行路由注册
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// =================================================================================
package hi
import (
"demo/api/hi"
)
type ControllerV1 struct{}
func NewV1() hi.IHiV1 {
return &ControllerV1{}
}
示例:
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()
s.Use(ghttp.MiddlewareHandlerResponse)
s.Group("/", func(group *ghttp.RouterGroup) {
group.Bind(
hi.NewV1(),
)
})
s.Run()
return nil
},
运行后可以访问127.0.0.1:8000/hi看到响应结果:
Server层
涉及文件夹: internal
下的 service
与logic
文件夹
Service 文件夹
-
创建
example.go
文件
package service
import ...
// 1. 定义接口
type IExample interface {
Function(...)
}
// 2.定义接口变量
var localExample *IExample
// 3.定义获取接口实例函数
func Example() *IExample {
if local_ == nil {
panic("Example interface unrealized")
}
return localExample // 返回接口变量
}
// 4.定义接口实现注册方法
func RegisterExample(i *IExample) {
localExample = i
}
Logic 文件夹
在 Logic
文件夹下创建 logic.go
文件
package logic
import(
_ "example_object/internal/logic/example" //初始化接口实现包
)
在 main.go
初始化 logic
import _ "union_demo/internal/logic
创建 example
文件夹,并在文件夹下创建 example.go
package example
import ...
// 注册接口
func init() {
service.RegisterExample(&sExample{})
}
type sExample struct{}
// 具体实现
func (* sExample)Function(...){
......
}
最后通过接口的获取函数Example()获取接口变量进行方法调用。