Documentation
¶
Index ¶
- Constants
- Variables
- func FormatBytes[T IntAll](ByteSize T) string
- func GenerateECCCertificate(certificateTemplate x509.Certificate, outPath string) error
- func GenerateRSACertificate(bits int, certificateTemplate x509.Certificate, outPath string) error
- func GetLocation() *time.Location
- func GetTime() time.Time
- func LFULogIncr(counter uint8) uint8
- func Localize(t time.Time) time.Time
- func RegisterConverter(name string, converter Converter)
- func RegisterOnShutdown(shutdownCallback ShutdownCallback)
- func RegisterOnStartup(task Startup)
- func RegisterValidate(name string, validate Validate)
- func SetValue(destValue reflect.Value, source any) error
- func Version() string
- type AnyUnmarshaler
- type Converter
- type DBConnectFunc
- type Data
- type DataBase
- type Engine
- type EvictPolicy
- type ExpirationPolicy
- type FS
- type Float
- type HandlerFunc
- type Int
- type IntAll
- type Language
- type Level
- type Logger
- func (self *Logger) CheckSplit() error
- func (self *Logger) Debug(logs ...any)
- func (self *Logger) DebugF(format string, logs ...any)
- func (self *Logger) Error(logs ...any)
- func (self *Logger) ErrorF(format string, logs ...any)
- func (self *Logger) GetFile() (*os.File, error)
- func (self *Logger) Info(logs ...any)
- func (self *Logger) InfoF(format string, logs ...any)
- func (self *Logger) Log(level Level, logs ...any)
- func (self *Logger) LogF(level Level, format string, logs ...any)
- func (self *Logger) OnStartup(ctx context.Context, wg *sync.WaitGroup)
- func (self *Logger) Print(logger *Logger, level Level, logs ...any)
- func (self *Logger) SplitLogger() (*os.File, error)
- func (self *Logger) StartupName() string
- func (self *Logger) Warning(logs ...any)
- func (self *Logger) WarningF(format string, logs ...any)
- type MiddleWare
- type MiddleWares
- type ParamInfo
- type Params
- type Request
- func (request *Request) BodyParams() Params
- func (request *Request) BodyParamsJSON() Params
- func (request *Request) BodyParamsParsing(parsing parse.Parsing) Params
- func (request *Request) BodyParamsXML() Params
- func (request *Request) BodyParamsYAML() Params
- func (request *Request) QueryParams() Params
- func (request *Request) WithContext(ctx context.Context)
- type Response
- type ResponseWriter
- type Route
- type Router
- func (router Router) GetRoute() Route
- func (router *Router) Include(path string, desc string) *Router
- func (router *Router) NoRoute(viewSet ViewSet)
- func (router *Router) Path(path string, desc string, viewSet ViewSet)
- func (router *Router) StaticDir(path string, desc string, dirPath http.Dir)
- func (router *Router) StaticDirFS(path string, desc string, dirFS embed.FS, basePath string)
- func (router *Router) StaticFile(path string, desc string, filePath string)
- func (router *Router) StaticFileFS(path string, desc string, fileFS embed.FS, defaultPath string)
- func (router *Router) Use(middleware ...MiddleWare) *Router
- type SSL
- type ShutdownCallback
- type Startup
- type UInt
- type Validate
- type ValidationError
- type ViewSet
Examples ¶
Constants ¶
const ( LFUInitValue = 5 // LFU初始化值 LFULogFactor = 0.1 // LFU对数增长因子 MaxCounterValue = 255 // 计数器最大值 )
const ContentType = "Content-Type"
Variables ¶
var Cache = newCache()
var Settings = newSettings()
Http 服务
var Validator = newValidator()
Functions ¶
func FormatBytes ¶ added in v1.4.3
FormatBytes 将字节大小格式化为人类可读的字符串
类型参数:
- T IntAll: 整数类型
参数:
- ByteSize T: 字节大小
返回:
- string: 格式化后的字符串,如 "1.25 MB"
Example ¶
ExampleFormatBytes 展示如何使用 FormatBytes 函数格式化不同大小的字节数
package main
import (
"fmt"
"github.com/NeverStopDreamingWang/goi"
)
func main() {
// 基本单位示例
fmt.Println(goi.FormatBytes(512)) // 字节(B)
fmt.Println(goi.FormatBytes(1024)) // 千字节(KB)
fmt.Println(goi.FormatBytes(2048)) // 2KB
// 更大单位示例
fmt.Println(goi.FormatBytes(1024 * 1024)) // 兆字节(MB)
fmt.Println(goi.FormatBytes(1024 * 1024 * 1024)) // 吉字节(GB)
// 非整数倍示例
fmt.Println(goi.FormatBytes(1536)) // 1.5KB
fmt.Println(goi.FormatBytes(1024 * 1024 * 1.5)) // 1.5MB
// 不同整数类型示例
fmt.Println(goi.FormatBytes(int32(2048)))
fmt.Println(goi.FormatBytes(int64(3072)))
fmt.Println(goi.FormatBytes(uint(4096)))
}
Output: 512.00 B 1.00 KB 2.00 KB 1.00 MB 1.00 GB 1.50 KB 1.50 MB 2.00 KB 3.00 KB 4.00 KB
func GenerateECCCertificate ¶ added in v1.0.13
func GenerateECCCertificate(certificateTemplate x509.Certificate, outPath string) error
func GenerateRSACertificate ¶ added in v1.0.13
func GenerateRSACertificate(bits int, certificateTemplate x509.Certificate, outPath string) error
func GetLocation ¶ added in v1.4.3
GetLocation 获取当前时区
返回:
- *time.Location: 时区对象,如果Settings已初始化则返回配置的时区,否则返回系统本地时区
func GetTime ¶ added in v1.4.0
GetTime 获取当前时间
- Settings.USE_TZ=true:返回 GetLocation() 时区的时间 “有感知时区”
- Settings.USE_TZ=false:返回 GetLocation() 时区的时间,但时区标注为 UTC “无感知时区”,避免任何时区换算,直存直取
func RegisterConverter ¶
RegisterConverter 注册自定义URL参数转换器
参数:
- name string: 转换器名称
- converter Converter: 转换器
Example ¶
package main
import (
"github.com/NeverStopDreamingWang/goi"
)
// 手机号
var phoneConverter = goi.Converter{
Regex: `(1[3456789]\d{9})`,
ToGo: func(value string) (any, error) { return value, nil },
}
// 邮箱
var emailConverter = goi.Converter{
Regex: `([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})`,
ToGo: func(value string) (any, error) { return value, nil },
}
// URL
var urlConverter = goi.Converter{
Regex: `(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})`,
ToGo: func(value string) (any, error) { return value, nil },
}
// 日期 (YYYY-MM-DD)
var dateConverter = goi.Converter{
Regex: `(\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01]))`,
ToGo: func(value string) (any, error) { return value, nil },
}
// 时间 (HH:MM:SS)
var timeConverter = goi.Converter{
Regex: `((?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d)`,
ToGo: func(value string) (any, error) { return value, nil },
}
// IP地址 (IPv4)
var ipv4Converter = goi.Converter{
Regex: `((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))`,
ToGo: func(value string) (any, error) { return value, nil },
}
// 用户名 (字母开头,允许字母数字下划位)
var usernameConverter = goi.Converter{
Regex: `([a-zA-Z][a-zA-Z0-9_]{3,15})`,
ToGo: func(value string) (any, error) { return value, nil },
}
func main() {
// 注册路由转换器
// 手机号
goi.RegisterConverter("my_phone", phoneConverter)
// 邮箱
goi.RegisterConverter("my_email", emailConverter)
// URL
goi.RegisterConverter("my_url", urlConverter)
// 日期 (YYYY-MM-DD)
goi.RegisterConverter("my_date", dateConverter)
// 时间 (HH:MM:SS)
goi.RegisterConverter("my_time", timeConverter)
// IP地址 (IPv4)
goi.RegisterConverter("my_ipv4", ipv4Converter)
// 用户名 (字母开头,允许字母数字下划位)
goi.RegisterConverter("my_username", usernameConverter)
}
func RegisterOnShutdown ¶ added in v1.8.1
func RegisterOnShutdown(shutdownCallback ShutdownCallback)
RegisterOnShutdown 注册关闭服务回调处理程序
参数:
- shutdownCallback ShutdownCallback: 回调函数
注意:
- 回调函数会逆序执行(先注册的后执行)
func RegisterOnStartup ¶ added in v1.8.1
func RegisterOnStartup(task Startup)
RegisterOnStartup 注册一个在服务启动时运行的后台任务
参数:
- task Startup: 要注册的任务
注意:
- 请在 RunServer 执行之前注册,之后注册的任务不会执行
func RegisterValidate ¶ added in v1.3.2
RegisterValidate 注册自定义验证器
参数:
- name string: 验证器名称
- validate Validate: 验证器实例
Example ¶
ExampleRegisterValidate 展示如何注册和使用自定义验证器
package main
import (
"fmt"
"net/http"
"regexp"
"strconv"
"github.com/NeverStopDreamingWang/goi"
)
// phoneValidator 手机号验证器示例
type phoneValidator struct{}
func (validator phoneValidator) Validate(value any) goi.ValidationError {
switch typeValue := value.(type) {
case int:
valueStr := strconv.Itoa(typeValue)
var reStr = `^(1[3456789]\d{9})$`
re := regexp.MustCompile(reStr)
if !re.MatchString(valueStr) {
return goi.NewValidationError(http.StatusBadRequest, fmt.Sprintf("参数错误:%v", value))
}
case string:
var reStr = `^(1[3456789]\d{9})$`
re := regexp.MustCompile(reStr)
if !re.MatchString(typeValue) {
return goi.NewValidationError(http.StatusBadRequest, fmt.Sprintf("参数错误:%v", value))
}
default:
return goi.NewValidationError(http.StatusBadRequest, fmt.Sprintf("参数类型错误:%v", value))
}
return nil
}
func (validator phoneValidator) ToGo(value any) (any, goi.ValidationError) {
switch typeValue := value.(type) {
case int:
return strconv.Itoa(typeValue), nil
case string:
return typeValue, nil
default:
return fmt.Sprintf("%v", value), nil
}
}
// emailValidator 邮箱验证器示例
type emailValidator struct{}
func (validator emailValidator) Validate(value any) goi.ValidationError {
switch v := value.(type) {
case string:
re := regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)
if !re.MatchString(v) {
return goi.NewValidationError(http.StatusBadRequest, "invalid email format")
}
return nil
default:
return goi.NewValidationError(http.StatusBadRequest, "email must be string")
}
}
// 当解析参数值类型与结构体字段类型不一致,且结构体字段类型为自定义类型时,需要实现 ToGo 方法
func (validator emailValidator) ToGo(value any) (any, goi.ValidationError) {
switch v := value.(type) {
case string:
// 转换类型,并返回
return Email{Address: v}, nil
default:
// Validate 会拦截返回
return nil, nil
}
}
type CustomValidator struct{}
func (validator CustomValidator) Validate(value any) goi.ValidationError {
switch typeValue := value.(type) {
case string:
var reStr = `^(\d{16})$`
re := regexp.MustCompile(reStr)
if re.MatchString(typeValue) == false {
return goi.NewValidationError(http.StatusBadRequest, fmt.Sprintf("参数错误:%v", value))
}
default:
return goi.NewValidationError(http.StatusBadRequest, fmt.Sprintf("参数类型错误:%v", value))
}
return nil
}
func (validator CustomValidator) ToGo(value any) (any, goi.ValidationError) {
switch typeValue := value.(type) {
case string:
// 转换为自定义类型,并返回
return Custom(typeValue), nil
default:
// 尝试转换为字符串
return fmt.Sprintf("%v", value), nil
}
}
// 支持自定义类型
type Email struct {
Address string `json:"address"`
// 其它自定义字段
}
type Custom []byte
type testParamsValidParams struct {
Phone string `name:"phone" type:"phone" required:"true"`
Email *Email `name:"email" type:"email" required:"true"`
Custom Custom `name:"custom" type:"custom" required:"true"`
}
// ExampleRegisterValidate 展示如何注册和使用自定义验证器
func main() {
// 注册手机号验证器
goi.RegisterValidate("phone", phoneValidator{})
// 注册邮箱验证器
goi.RegisterValidate("email", emailValidator{})
// 注册自定义验证器
goi.RegisterValidate("custom", CustomValidator{})
var validationErr goi.ValidationError
var params testParamsValidParams
bodyParams := goi.Params{
"phone": "13800000000",
"email": "test@example.com",
"custom": "1234567890123456",
}
validationErr = bodyParams.ParseParams(¶ms)
if validationErr != nil {
return
}
fmt.Printf("Phone %+v %T\n", params.Phone, params.Phone)
fmt.Printf("Email %+v %T\n", params.Email, params.Email)
fmt.Printf("Custom %+v %T\n", params.Custom, params.Custom)
}
Output: Phone 13800000000 string Email &{Address:test@example.com} *goi_test.Email Custom [49 50 51 52 53 54 55 56 57 48 49 50 51 52 53 54] goi_test.Custom
func SetValue ¶ added in v1.4.4
SetValue 将 source 赋值给 destValue
参数:
- destValue reflect.Value: 目标值
- source any: 源值
Example ¶
package main
import (
"fmt"
"reflect"
"github.com/NeverStopDreamingWang/goi"
)
type testStruct struct {
Username string `name:"username"`
Password string `name:"password"`
Age int `name:"age"`
Custom []string `name:"custom" type:"custom" required:"true"`
}
func main() {
source := map[string]any{
"username": "test_user",
"password": "test123456",
"age": 18,
"custom": []any{111, "test1", "test2"},
}
dest := &testStruct{}
destValue := reflect.ValueOf(dest)
err := goi.SetValue(destValue, source)
if err != nil {
return
}
fmt.Printf("Username: %+v %T\n", dest.Username, dest.Username)
fmt.Printf("Password: %+v %T\n", dest.Password, dest.Password)
fmt.Printf("Age: %+v %T\n", dest.Age, dest.Age)
fmt.Printf("Custom: %+v %T\n", dest.Custom, dest.Custom)
}
Output: Username: test_user string Password: test123456 string Age: 18 int Custom: [111 test1 test2] []string
Example (Manual) ¶
package main
import (
"fmt"
"reflect"
"strings"
"github.com/NeverStopDreamingWang/goi"
)
type testStruct struct {
Username string `name:"username"`
Password string `name:"password"`
Age int `name:"age"`
Custom []string `name:"custom" type:"custom" required:"true"`
}
func main() {
source := map[string]any{
"username": "test_user",
"password": "test123456",
"age": 18,
"custom": []any{111, "test1", "test2"},
}
dest := &testStruct{}
destValue := reflect.ValueOf(dest)
if destValue.Kind() != reflect.Ptr {
return
}
destValue = destValue.Elem()
destType := destValue.Type()
// 遍历参数结构体的字段
for i := 0; i < destType.NumField(); i++ {
var err error
var fieldValue reflect.Value
var fieldType reflect.StructField
var fieldName string
fieldValue = destValue.Field(i)
fieldType = destType.Field(i)
if !fieldValue.CanSet() {
continue
}
fieldName = fieldType.Tag.Get("name")
if fieldName == "" || fieldName == "-" {
fieldName = strings.ToLower(fieldType.Name) // 字段名
}
value, ok := source[fieldName]
if !ok {
continue
}
err = goi.SetValue(fieldValue, value)
if err != nil {
return
}
}
fmt.Printf("Username: %+v %T\n", dest.Username, dest.Username)
fmt.Printf("Password: %+v %T\n", dest.Password, dest.Password)
fmt.Printf("Age: %+v %T\n", dest.Age, dest.Age)
fmt.Printf("Custom: %+v %T\n", dest.Custom, dest.Custom)
}
Output: Username: test_user string Password: test123456 string Age: 18 int Custom: [111 test1 test2] []string
Types ¶
type AnyUnmarshaler ¶ added in v1.10.0
type Converter ¶ added in v1.5.0
func GetConverter ¶ added in v1.6.0
GetConverter 获取转换器
参数:
- name string: 转换器名称
返回:
- Converter: 转换器
- bool: 是否存在
type DBConnectFunc ¶ added in v1.6.0
type Data ¶
type Data struct {
Code int `json:"code"` // 响应状态码
Message string `json:"message"` // 响应消息
Results any `json:"results"` // 响应数据
}
Data 自定义标准的API响应格式
字段:
- Code int: 响应状态码
- Message string: 响应消息
- Results any: 响应数据
type DataBase ¶ added in v1.3.2
type DataBase struct {
ENGINE string
Connect func(ENGINE string) *sql.DB // 使用时自动连接
// contains filtered or unexported fields
}
DataBase 数据库连接管理器
字段:
- ENGINE string: 数据库引擎名称
- Connect func: 数据库连接函数,使用时才会连接,且仅会调用一次
- db *sql.DB: 数据库连接实例
type Engine ¶
type Engine struct {
Router *Router // 路由
Settings *settings // 设置
Cache *cache // 缓存
Log *Logger // 日志
Validator *validator // 验证器
// contains filtered or unexported fields
}
Engine 实现 ServeHTTP 接口
func (*Engine) ServeHTTP ¶
func (engine *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request)
实现 ServeHTTP 接口
参数:
- w http.ResponseWriter: 响应写入器
- r *http.Request: HTTP请求对象
func (*Engine) StopServer ¶ added in v1.1.0
停止 http 服务
type EvictPolicy ¶
type EvictPolicy uint8
EvictPolicy 缓存淘汰策略类型
const ( NOEVICTION EvictPolicy = iota // 直接抛出错误,不淘汰任何已经存在的键 ALLKEYS_RANDOM // 所有的键 随机移除 key ALLKEYS_LRU // 所有的键 移除最近最少使用的 key ALLKEYS_LFU // 所有的键 移除最近最不频繁使用的 key VOLATILE_RANDOM // 所有设置了过期时间的键 随机移除 key VOLATILE_LRU // 所有设置了过期时间的键 移除最近最少使用的 key VOLATILE_LFU // 所有设置了过期时间的键 移除最近最不频繁使用的 key VOLATILE_TTL // 所有设置了过期时间的键 移除快过期的 key )
缓存淘汰策略
type ExpirationPolicy ¶
type ExpirationPolicy uint8
ExpirationPolicy 缓存过期策略类型
const ( // 默认惰性删除: 在获取某个 key 的时候,检查这个 key 如果设置了过期时间并且过期了,是的话就删除。 // 定期删除: 默认每隔 1s 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果有过期就删除。 // 定时删除: 某个设置了过期时间的 key,到期后立即删除。 PERIODIC ExpirationPolicy = iota // 定期删除 SCHEDULED // 定时删除 )
过期策略
type HandlerFunc ¶
HandlerFunc 定义 goi 使用的请求处理程序
func StaticDirFSView ¶ added in v1.5.0
func StaticDirFSView(dirFS fs.FS, basePath string) HandlerFunc
StaticDirFSView fs.FS 静态目录嵌入式文件视图
参数:
- dirFS fs.FS: 嵌入式文件系统
- basePath string: 嵌入式文件系统基础路径
说明:
- 需要在路由中包含 <path:fileName> 参数
- 会自动拼接 basePath + fileName 为嵌入文件查找路径
- 生成静态路由的通用 View ,由上层统一处理 Content-Type
func StaticDirView ¶ added in v1.5.0
func StaticDirView(dirPath http.Dir) HandlerFunc
StaticDirView 静态目录视图
参数:
- dirPath http.Dir: 目录路径
返回:
- HandlerFunc: 处理函数
说明:
- 生成静态路由的通用 View ,由上层统一处理 Content-Type
func StaticFileFSView ¶ added in v1.5.0
func StaticFileFSView(fileFS fs.FS, defaultPath string) HandlerFunc
StaticFileFSView fs.FS 静态文件嵌入式文件视图
参数:
- fileFS fs.FS: 嵌入式文件系统
- defaultPath string: 默认响应嵌入式文件的路径
说明:
- 生成静态路由的通用 View ,由上层统一处理 Content-Type
func StaticFileView ¶ added in v1.5.0
func StaticFileView(filePath string) HandlerFunc
StaticFileView 静态文件视图
参数:
- filePath string: 文件路径
返回:
- HandlerFunc: 处理函数
说明:
- 生成静态路由的通用 View ,由上层统一处理 Content-Type
type Logger ¶ added in v1.9.0
type Logger struct {
Name string // 日志名称
Path string // 日志输出路径
File *os.File // 日志文件对象
Logger *log.Logger // 日志对象
SplitSize int64 // 日志切割大小,默认为 1G 1024 * 1024 * 1024
SplitTime string // 日志切割大小,默认按天切割
SplitInterval time.Duration // 日志切割检查间隔
CreateTime time.Time // 日志文件创建时间,每次日志切割时需要重置
// 自定义方法
PrintFunc func(logger *Logger, level Level, logs ...any) // 自定义日志输出格式
GetFileFunc func(filePath string) (*os.File, error) // 创建文件对象方法
SplitLoggerFunc func(metaLogger *Logger) (*os.File, error) // 自定义日志切割:符合切割条件时,传入日志对象,返回新的文件对象
// contains filtered or unexported fields
}
Logger 日志管理器
var Log *Logger
func (*Logger) LogF ¶ added in v1.10.0
LogF 记录指定级别的日志
参数:
- level Level: 日志级别
- format string: 日志格式
- logs ...any: 日志内容
func (*Logger) OnStartup ¶ added in v1.10.0
OnStartup 日志切割管理协程
参数:
- ctx context.Context: 上下文对象,用于控制协程退出
- wg *sync.WaitGroup: 等待组,用于同步协程
func (*Logger) Print ¶ added in v1.10.0
Print 默认日志打印格式化函数
参数:
- logger *Logger: 日志器
- level Level: 日志级别
- logs ...any: 日志内容
func (*Logger) SplitLogger ¶ added in v1.10.0
SplitLogger 默认日志切割实现
返回:
- *os.File: 新的日志文件对象
- error: 切割过程中的错误信息
type MiddleWare ¶ added in v1.5.0
type MiddleWare interface {
ProcessRequest(request *Request) any // 请求中间件
ProcessException(request *Request, exception any) any // 异常中间件
ProcessResponse(request *Request, response *Response) // 响应中间件
}
中间件 MiddleWare 定义中间件接口: - ProcessRequest:请求阶段(顺序执行);返回 nil 则继续执行,否则直接写入响应返回,内层不再进入 - ProcessException:异常阶段(逆序执行); - ProcessResponse:响应阶段(逆序执行);常用于追加/修改响应头
type MiddleWares ¶ added in v1.9.0
type MiddleWares []MiddleWare
type Params ¶ added in v1.4.4
func (Params) Get ¶ added in v1.4.4
func (values Params) Get(key string, dest any) ValidationError
根据键读取一个值到 dest
func (Params) ParseParams ¶ added in v1.4.4
func (values Params) ParseParams(paramsDest any) ValidationError
解析参数到指定结构体
type Request ¶
Request 封装HTTP请求相关信息
参数:
- Object *http.Request: 原始HTTP请求对象,包含完整的HTTP请求信息
- PathParams Params: 路由参数,存储URL路径中的动态参数值
- Params Params: 自定义参数,可在整个请求处理过程中传递和共享数据
用于在处理请求时提供统一的访问接口
func (*Request) BodyParams ¶
Params 解析并返回请求体中的参数
支持的Content-Type:
- multipart/form-data
- application/x-www-form-urlencoded
- application/json
返回:
- Params: 请求体参数的键值对映射
注意:
- JSON数据会被解析为any类型
- 如果解析失败会触发panic
func (*Request) BodyParamsJSON ¶ added in v1.4.4
func (*Request) BodyParamsParsing ¶ added in v1.4.4
func (*Request) BodyParamsXML ¶ added in v1.4.4
func (*Request) BodyParamsYAML ¶ added in v1.4.4
func (*Request) QueryParams ¶
QueryParams 解析并返回URL查询字符串参数 匹配模式: URL中的查询参数,格式为 ?key=value&key2=value2 示例: /api/users?page=1&size=10 返回一个Params类型的map,包含所有查询参数
返回:
- Params: URL查询参数的键值对映射,其中值为字符串切片
func (*Request) WithContext ¶ added in v1.4.0
WithContext 更新请求对象中的上下文信息
参数:
- ctx context.Context: 新的上下文对象
type Response ¶
type Response struct {
Status int // HTTP状态码
Data any // 响应数据
// contains filtered or unexported fields
}
Response 定义处理程序的响应格式
字段:
- Status int: HTTP状态码
- Data any: 响应数据
示例: {Status: 200, Data: {"message": "success"}}
type ResponseWriter ¶ added in v1.5.0
type ResponseWriter struct {
http.ResponseWriter // 内嵌http.ResponseWriter接口
Status int // 响应状态码
Bytes int64 // 已写入的字节数
}
ResponseWriter 自定义响应写入器
字段:
- ResponseWriter http.ResponseWriter: 标准响应写入器
- StatusCode int: 响应状态码
- Bytes int64: 已写入的字节数
用于请求日志记录和响应监控
func (*ResponseWriter) Write ¶ added in v1.5.0
func (responseWriter *ResponseWriter) Write(b []byte) (int, error)
Write 写入响应数据
参数:
- b []byte: 要写入的数据
返回:
- int: 已写入的字节数
- error: 写入过程中的错误信息
func (*ResponseWriter) WriteHeader ¶ added in v1.5.0
func (responseWriter *ResponseWriter) WriteHeader(code int)
WriteHeader 设置HTTP响应状态码
参数:
- code int: HTTP状态码
type Route ¶ added in v1.6.0
type Route struct {
Path string // 路由
Desc string // 描述
ViewSet ViewSet // 视图方法
NoRoute *ViewSet // 无路由视图
Include []Route // 子路由
Handlers MiddleWares // 路由中间件
// 预编译
Pattern string // 路由正则表达式
Regex *regexp.Regexp // 路由正则表达式匹配对象
ParamInfos []ParamInfo // 参数信息列表
}
Route 为 Router 路由的副本
type Router ¶ added in v1.9.0
type Router struct {
// contains filtered or unexported fields
}
路由表
func (*Router) Include ¶ added in v1.9.0
Include 创建一个子路由
参数:
- path: string 路由
- desc: string 描述
返回:
- *Router: 子路由实例
func (*Router) Path ¶ added in v1.9.0
Path 注册一个路由
参数:
- path: string 路由
- desc: string 描述
- viewSet: ViewSet 视图方法
func (*Router) StaticDir ¶ added in v1.9.0
StaticDir 注册静态目录路由
参数:
- path: string 路由
- desc: string 描述
- dirPath: http.Dir 静态映射路径
func (*Router) StaticDirFS ¶ added in v1.9.0
StaticDirFS 注册 embed.FS 静态目录路由
参数:
- path: string 路由
- desc: string 描述
- dirFS: embed.FS 嵌入式文件系统
- basePath: string 嵌入文件基础路径
说明:
- path 路径之后自动添加 /<path:fileName> 参数
- 会自动拼接 basePath + fileName 为嵌入文件查找路径
func (*Router) StaticFile ¶ added in v1.9.0
StaticFile 注册静态文件路由
参数:
- path: string 路由
- desc: string 描述
- filePath: string 文件路径
func (*Router) StaticFileFS ¶ added in v1.9.0
StaticFileFS 注册 embed.FS 静态文件路由
参数:
- path: string 路由
- desc: string 描述
- fileFS: embed.FS 嵌入式文件系统
- defaultPath: string 嵌入文件默认路径
func (*Router) Use ¶ added in v1.9.0
func (router *Router) Use(middleware ...MiddleWare) *Router
Use 注册路由中间件
参数:
- middleware ...MiddleWare: 中间件函数
返回:
- *Router: 当前路由实例
type ShutdownCallback ¶ added in v1.4.0
type ShutdownCallback interface {
// ShutdownName 关闭服务名称
ShutdownName() string
// OnShutdown 关闭服务处理程序
OnShutdown() error
}
关闭服务回调
type Startup ¶ added in v1.8.1
type Startup interface {
// StartupName 启动任务名称
StartupName() string
// OnStartup 启动任务(通常内部是一个循环,监听 ctx.Done)
OnStartup(ctx context.Context, wg *sync.WaitGroup)
}
Startup 表示一个在服务启动时运行的后台任务
type Validate ¶ added in v1.5.0
type Validate interface {
Validate(value any) ValidationError
ToGo(value any) (any, ValidationError)
}
Validate 验证器接口
方法:
- Validate: 验证方法
- ToGo: 将字符串转换为Go值,ToGo 的返回值要与读取字段类型一致
func GetValidate ¶ added in v1.6.0
GetValidate 获取验证器
参数:
- name string: 验证器名称
返回:
- Validate: 验证器实例
- bool: 是否存在
type ValidationError ¶ added in v1.3.0
type ValidationError interface {
// NewValidationError 创建参数验证错误
//
// 参数:
// - status int: HTTP状态码
// - message string: 错误消息
// - args ...any: 可选参数
//
// 返回:
// - ValidationError: 验证错误实例
NewValidationError(status int, message string, args ...any) ValidationError
// Error 返回错误消息
Error() string
// Response 生成错误响应
//
// 返回:
// - Response: 标准响应格式
Response() Response
}
ValidationError 参数验证错误处理器接口
方法:
- NewValidationError: 创建参数验证错误
- Error: 实现 error 接口,返回错误消息
- Response: 生成错误响应
func NewValidationError ¶ added in v1.3.0
func NewValidationError(status int, message string, args ...any) ValidationError
NewValidationError 创建全局参数验证错误
参数:
- status int: HTTP状态码
- message string: 错误消息
- args ...any: 可选参数
返回:
- ValidationError: 验证错误实例
type ViewSet ¶ added in v1.5.0
type ViewSet struct {
GET HandlerFunc // 获取资源
HEAD HandlerFunc // 获取响应头
POST HandlerFunc // 创建资源
PUT HandlerFunc // 更新资源
PATCH HandlerFunc // 部分更新
DELETE HandlerFunc // 删除资源
CONNECT HandlerFunc // 建立隧道
OPTIONS HandlerFunc // 查询支持的方法
TRACE HandlerFunc // 回显请求
NoMethod HandlerFunc // 未注册或不支持的HTTP方法时的处理函数,默认返回 405
}
路由视图
func (ViewSet) GetHandlerFunc ¶ added in v1.5.0
func (viewSet ViewSet) GetHandlerFunc(method string) (HandlerFunc, error)
GetHandlerFunc 获取视图方法
参数:
- method string: HTTP方法
返回:
- HandlerFunc: 处理函数
- error: 错误信息