goi

package module
v1.10.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 13, 2026 License: MIT Imports: 37 Imported by: 0

README

goi

基于 net/http 开发的一个 Web 框架,语法与 Django 类似,简单易用,快速上手,详情请查看示例

详细示例:goi_example

goi 创建命令

使用 go env GOMODCACHE 获取 go 软件包路径:mypath\Go\pkg\mod + github.com\!never!stop!dreaming!wang\goi@v版本号\goi\goi.exe

使用 go env GOROOT 获取 go 安装路径 mypath\Go + bin 将可执行文件复制到 Go\bin 目录下

Windows: copy mypath\Go\pkg\mod\github.com\!never!stop!dreaming!wang\goi@v版本号\goi\goi.exe mypath\Go\bin\goi.exe

编译

go build -p=1 -o goi.exe

Linux: cp mypath\go\pkg\mod\github.com\!never!stop!dreaming!wang\goi@v版本号\goi\goi mypath\go\bin\goi

自定义编译

go build -o goi
goi 命令使用
> goi

Usage(用法):                                         
        goi <command> [arguments]                      
The commands are(命令如下):                          
        create-project  myproject   创建项目       
        create-app      myapp       创建app

示例

# 创建项目
> goi create-project example

# 新建应用 app
> cd example
> goi create-app myapp

快速开始

前置条件

Goi 需要 Go 1.24 或更高版本。

获取 Goi

通过 Go 的模块支持,当你在代码中添加导入时,go [build|run|test] 会自动获取必要的依赖:

import "github.com/NeverStopDreamingWang/goi"

或者,使用 go get

go get -u github.com/NeverStopDreamingWang/goi
运行 Goi

一个基础示例:

package main

import (
	"net/http"

	"github.com/NeverStopDreamingWang/goi"
)

func Ping(request *goi.Request) any {
	goi.Log.DebugF("Test1")

	return goi.Data{
		Code:    http.StatusOK,
		Message: "Hello World",
		Results: nil,
	}
}

func main() {
	// 创建 Goi 服务器
	Server := goi.NewHttpServer()
	// 网络协议
	Server.Settings.NET_WORK = "tcp" // 默认 "tcp" 常用网络协议 "tcp"、"tcp4"、"tcp6"、"udp"、"udp4"、"udp6
	// 监听地址 0.0.0.0
	Server.Settings.BIND_ADDRESS = "0.0.0.0" // 默认 127.0.0.1
	// 监听端口 8080
	Server.Settings.PORT = 8080

	// 注册路由
	Server.Router.Path("ping", "测试接口", goi.ViewSet{GET: Ping})

	// 启动服务器
	Server.RunServer()
}

运行代码,使用 go run 命令:

go run main.go

然后在浏览器中访问 http://0.0.0.0:8080/ping 查看响应!

Documentation

Index

Examples

Constants

View Source
const (
	LFUInitValue    = 5   // LFU初始化值
	LFULogFactor    = 0.1 // LFU对数增长因子
	MaxCounterValue = 255 // 计数器最大值
)
View Source
const ContentType = "Content-Type"

Variables

View Source
var Cache = newCache()
View Source
var Settings = newSettings()

Http 服务

View Source
var Validator = newValidator()

Functions

func FormatBytes added in v1.4.3

func FormatBytes[T IntAll](ByteSize T) string

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

func GetLocation() *time.Location

GetLocation 获取当前时区

返回:

  • *time.Location: 时区对象,如果Settings已初始化则返回配置的时区,否则返回系统本地时区

func GetTime added in v1.4.0

func GetTime() time.Time

GetTime 获取当前时间

  • Settings.USE_TZ=true:返回 GetLocation() 时区的时间 “有感知时区”
  • Settings.USE_TZ=false:返回 GetLocation() 时区的时间,但时区标注为 UTC “无感知时区”,避免任何时区换算,直存直取

func LFULogIncr

func LFULogIncr(counter uint8) uint8

LFULogIncr 计算LFU访问频率的递增值

参数:

  • counter uint8: 当前计数值

返回:

  • uint8: 更新后的计数值

func Localize added in v1.5.0

func Localize(t time.Time) time.Time

Localize 将给定时间转换为当前配置时区的“表示”(不改变时间瞬间,仅改变 Location)

func RegisterConverter

func RegisterConverter(name string, converter Converter)

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

func RegisterValidate(name string, validate Validate)

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(&params)
	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

func SetValue(destValue reflect.Value, source any) error

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

func Version

func Version() string

Version 获取 goi 版本

返回:

  • string: goi 版本

Types

type AnyUnmarshaler added in v1.10.0

type AnyUnmarshaler interface {
	UnmarshalAny(value any) error
}

type Converter added in v1.5.0

type Converter struct {
	Regex string
	// 将 URL 片段转换为 Go 值
	ToGo func(string) (any, error)
}

func GetConverter added in v1.6.0

func GetConverter(name string) (Converter, bool)

GetConverter 获取转换器

参数:

  • name string: 转换器名称

返回:

  • Converter: 转换器
  • bool: 是否存在

type DBConnectFunc added in v1.6.0

type DBConnectFunc func() *sql.DB

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: 数据库连接实例

func (*DataBase) Close added in v1.3.2

func (database *DataBase) Close() error

Close 关闭数据库连接

返回:

  • error: 关闭过程中的错误信息,如果连接不存在则返回nil

func (*DataBase) DB added in v1.3.2

func (database *DataBase) DB() *sql.DB

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 NewHttpServer

func NewHttpServer() *Engine

创建一个 Http 服务

func (*Engine) RunServer

func (engine *Engine) RunServer()

启动 http 服务

func (*Engine) RunTime added in v1.1.0

func (engine *Engine) RunTime() time.Duration

获取当前运行时间 返回时间间隔

返回:

  • time.Duration: 运行时间间隔

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

func (engine *Engine) StopServer() (err error)

停止 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 FS added in v1.6.2

type FS struct {
	FS   fs.FS
	Name string
}

type Float

type Float interface {
	float32 | float64
}

type HandlerFunc

type HandlerFunc func(request *Request) any

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 Int

type Int interface {
	int | int8 | int16 | int32 | int64
}

type IntAll

type IntAll interface {
	int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64
}

type Language added in v1.3.2

type Language string
const (
	ZH_CN Language = "zh-CN" // 中文-简体
	EN_US Language = "en-US" // 英文-美国
)

框架语言

type Level added in v1.1.0

type Level string

Level 日志等级类型

const (
	DEBUG   Level = "DEBUG"
	INFO    Level = "INFO"
	WARNING Level = "WARNING"
	ERROR   Level = "ERROR"
)

日志等级

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 NewLogger

func NewLogger(path string) *Logger

NewLogger 创建新的日志器

参数:

  • path string: 日志输出路径,例如 "logs/server.log"

返回:

  • *Logger: 日志器实例

func (*Logger) CheckSplit added in v1.10.0

func (self *Logger) CheckSplit() error

CheckSplit 检查是否需要进行日志切割

返回:

  • error: 检查过程中的错误信息

func (*Logger) Debug added in v1.10.0

func (self *Logger) Debug(logs ...any)

Debug 记录调试级别日志

参数:

  • logs ...any: 日志内容

func (*Logger) DebugF added in v1.10.0

func (self *Logger) DebugF(format string, logs ...any)

DebugF 记录调试级别日志

参数:

  • format string: 日志格式
  • logs ...any: 日志内容

func (*Logger) Error added in v1.10.0

func (self *Logger) Error(logs ...any)

Error 记录错误级别日志

参数:

  • logs ...any: 日志内容

func (*Logger) ErrorF added in v1.10.0

func (self *Logger) ErrorF(format string, logs ...any)

ErrorF 记录错误级别日志

参数:

  • format string: 日志格式
  • logs ...any: 日志内容

func (*Logger) GetFile added in v1.10.0

func (self *Logger) GetFile() (*os.File, error)

GetFile 默认文件创建函数

返回:

  • *os.File: 文件对象
  • error: 创建过程中的错误信息

func (*Logger) Info added in v1.10.0

func (self *Logger) Info(logs ...any)

Info 记录信息级别日志

参数:

  • logs ...any: 日志内容

func (*Logger) InfoF added in v1.10.0

func (self *Logger) InfoF(format string, logs ...any)

InfoF 记录信息级别日志

参数:

  • format string: 日志格式
  • logs ...any: 日志内容

func (*Logger) Log added in v1.10.0

func (self *Logger) Log(level Level, logs ...any)

Log 记录指定级别的日志

参数:

  • level Level: 日志级别
  • logs ...any: 日志内容

func (*Logger) LogF added in v1.10.0

func (self *Logger) LogF(level Level, format string, logs ...any)

LogF 记录指定级别的日志

参数:

  • level Level: 日志级别
  • format string: 日志格式
  • logs ...any: 日志内容

func (*Logger) OnStartup added in v1.10.0

func (self *Logger) OnStartup(ctx context.Context, wg *sync.WaitGroup)

OnStartup 日志切割管理协程

参数:

  • ctx context.Context: 上下文对象,用于控制协程退出
  • wg *sync.WaitGroup: 等待组,用于同步协程

func (*Logger) Print added in v1.10.0

func (self *Logger) Print(logger *Logger, level Level, logs ...any)

Print 默认日志打印格式化函数

参数:

  • logger *Logger: 日志器
  • level Level: 日志级别
  • logs ...any: 日志内容

func (*Logger) SplitLogger added in v1.10.0

func (self *Logger) SplitLogger() (*os.File, error)

SplitLogger 默认日志切割实现

返回:

  • *os.File: 新的日志文件对象
  • error: 切割过程中的错误信息

func (*Logger) StartupName added in v1.10.0

func (self *Logger) StartupName() string

StartupName 启动任务名称

返回:

  • string: 启动任务名称

func (*Logger) Warning added in v1.10.0

func (self *Logger) Warning(logs ...any)

Warning 记录警告级别日志

参数:

  • logs ...any: 日志内容

func (*Logger) WarningF added in v1.10.0

func (self *Logger) WarningF(format string, logs ...any)

WarningF 记录警告级别日志

参数:

  • format string: 日志格式
  • logs ...any: 日志内容

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 ParamInfo added in v1.5.0

type ParamInfo struct {
	Name      string     // 参数名称
	Converter *Converter // 转换器指针
}

ParamInfo 路由参数信息

type Params added in v1.4.4

type Params map[string]any

func (Params) Del added in v1.4.4

func (values Params) Del(key string)

删除一个值

func (Params) Get added in v1.4.4

func (values Params) Get(key string, dest any) ValidationError

根据键读取一个值到 dest

func (Params) Has added in v1.4.4

func (values Params) Has(key string) bool

查看值是否存在

func (Params) ParseParams added in v1.4.4

func (values Params) ParseParams(paramsDest any) ValidationError

解析参数到指定结构体

func (Params) Set added in v1.4.4

func (values Params) Set(key string, value any)

设置一个键值,会覆盖原来的值

type Request

type Request struct {
	Object     *http.Request
	PathParams Params
	Params     Params
}

Request 封装HTTP请求相关信息

参数:

  • Object *http.Request: 原始HTTP请求对象,包含完整的HTTP请求信息
  • PathParams Params: 路由参数,存储URL路径中的动态参数值
  • Params Params: 自定义参数,可在整个请求处理过程中传递和共享数据

用于在处理请求时提供统一的访问接口

func (*Request) BodyParams

func (request *Request) BodyParams() Params

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 *Request) BodyParamsJSON() Params

func (*Request) BodyParamsParsing added in v1.4.4

func (request *Request) BodyParamsParsing(parsing parse.Parsing) Params

func (*Request) BodyParamsXML added in v1.4.4

func (request *Request) BodyParamsXML() Params

func (*Request) BodyParamsYAML added in v1.4.4

func (request *Request) BodyParamsYAML() Params

func (*Request) QueryParams

func (request *Request) QueryParams() Params

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

func (request *Request) WithContext(ctx context.Context)

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"}}

func (*Response) Header added in v1.5.0

func (response *Response) Header() http.Header

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) GetRoute added in v1.9.0

func (router Router) GetRoute() Route

GetRoute 获取路由信息

返回:

  • Route: 路由信息

func (*Router) Include added in v1.9.0

func (router *Router) Include(path string, desc string) *Router

Include 创建一个子路由

参数:

  • path: string 路由
  • desc: string 描述

返回:

  • *Router: 子路由实例

func (*Router) NoRoute added in v1.9.0

func (router *Router) NoRoute(viewSet ViewSet)

NoRoute 注册未匹配路由时的处理视图,默认返回 404

参数:

  • viewSet: ViewSet 视图方法

func (*Router) Path added in v1.9.0

func (router *Router) Path(path string, desc string, viewSet ViewSet)

Path 注册一个路由

参数:

  • path: string 路由
  • desc: string 描述
  • viewSet: ViewSet 视图方法

func (*Router) StaticDir added in v1.9.0

func (router *Router) StaticDir(path string, desc string, dirPath http.Dir)

StaticDir 注册静态目录路由

参数:

  • path: string 路由
  • desc: string 描述
  • dirPath: http.Dir 静态映射路径

func (*Router) StaticDirFS added in v1.9.0

func (router *Router) StaticDirFS(path string, desc string, dirFS embed.FS, basePath string)

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

func (router *Router) StaticFile(path string, desc string, filePath string)

StaticFile 注册静态文件路由

参数:

  • path: string 路由
  • desc: string 描述
  • filePath: string 文件路径

func (*Router) StaticFileFS added in v1.9.0

func (router *Router) StaticFileFS(path string, desc string, fileFS embed.FS, defaultPath string)

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 SSL added in v1.9.0

type SSL struct {
	STATUS    bool
	TYPE      string
	CERT_PATH string
	KEY_PATH  string
}

SSL

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 UInt

type UInt interface {
	uint | uint8 | uint16 | uint32 | uint64
}

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

func GetValidate(name string) (Validate, bool)

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: 错误信息

func (ViewSet) GetMethods added in v1.8.0

func (viewSet ViewSet) GetMethods() []string

GetMethods 获取允许的HTTP方法列表

返回:

  • []string: 允许的HTTP方法列表

Directories

Path Synopsis
aes
rsa
db
internal
middleware

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL