kanggo

package module
v1.0.4 Latest Latest
Warning

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

Go to latest
Published: Sep 16, 2024 License: MIT Imports: 16 Imported by: 0

README

KangGo

KangGo 是一个极简且高性能的 Go Web 框架,致力于为开发者提供快速、灵活和高效的开发体验。它采用现代化的设计理念,专注于性能优化和可扩展性,适用于构建各类 Web 应用。框架结构简洁,易于上手,同时具备高度的模块化,方便开发者根据需求进行定制和扩展。

特性

  • ⚡️ 超高性能路由:采用自适应 Radix Tree(Adaptive Radix Tree, ART)与暴力哈希表(Perfect Hashing)结合的混合路由算法,实现 O(1) 静态路由查找和近乎 O(1) 的动态路由匹配,确保极致的请求处理性能。
  • 🔄 异步非阻塞 I/O:核心设计支持异步非阻塞请求处理,充分利用 Go 的 Goroutine 并发机制,提升 I/O 密集型任务的吞吐量。
  • 🔌 模块化中间件体系:支持全局和路由级中间件,开发者可以灵活组合使用,提供请求处理和响应的高度定制化能力。
  • 🧩 插件式架构:核心功能模块化设计,支持通过插件方式动态加载扩展功能,方便快速迭代和更新。
  • 📦 无外部依赖:尽可能使用 Go 标准库实现功能,减少外部依赖,保持框架轻量且安全。
  • 📈 智能内存管理:优化的内存分配策略,减少垃圾回收(GC)压力,确保高并发场景下的稳定性能表现。
  • 🔧 自定义配置:支持灵活的配置选项,包括自定义 JSON 编解码器和欢迎横幅显示。

快速开始

安装
go get -u github.com/7836246/kanggo@latest
使用示例
package main

import (
    "fmt"
    "github.com/7836246/kanggo"
    "encoding/json"
)

func main() {
    // 使用自定义的 JSON 编解码器配置
    cfg := kanggo.Config{
        JSONEncoder: json.Marshal,
        JSONDecoder: json.Unmarshal,
        ShowBanner:  true,
    }

    // 使用 Default() 初始化框架
    app := kanggo.New(cfg)

    // 注册静态路由
    app.GET("/home", func(ctx *kanggo.Context) error {
        return ctx.SendString("Welcome to the home page!")
    })

    // 注册带命名参数的动态路由
    app.GET("/user/:id", func(ctx *kanggo.Context) error {
        id := ctx.Param("id")
        if id == "" {
            return fmt.Errorf("id 参数缺失")
        }
        msg := fmt.Sprintf("用户ID:%s", id)
        return ctx.SendString(msg)
    })

    // 启动服务器
    app.Run(":8080")
}

高级特性

  • 路由组:支持路由分组,方便 API 管理。
  • 内置中间件:日志、恢复、跨域等常用中间件开箱即用。
  • 内存池:高效的内存管理,减少 GC 开销,提高并发处理能力。

未来路线图

  • 🔧 增强路由解析算法,支持更复杂的路由匹配规则。
  • 🛡️ 提供更多内置中间件(如限流、身份验证等)。
  • 🌍 支持国际化和本地化。
  • 📜 集成 Swagger 自动文档生成。

贡献

欢迎参与 KangGo 的开发!请提交 Pull Request 或 Issue 来帮助我们改善这个框架。

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func PrintWelcomeBanner

func PrintWelcomeBanner()

PrintWelcomeBanner 显示欢迎横幅和版本信息

Types

type Config

type Config struct {
	JSONEncoder          func(v interface{}) ([]byte, error)    // 自定义 JSON 编码器,默认使用标准库的 json.Marshal
	JSONDecoder          func(data []byte, v interface{}) error // 自定义 JSON 解码器,默认使用标准库的 json.Unmarshal
	ShowBanner           bool                                   // 是否在启动时显示欢迎横幅,默认显示
	PrintRoutes          bool                                   // 是否在启动时打印所有已注册的路由信息,默认打印
	ServerHeader         string                                 // 设置服务器响应头的 Server 字段,默认为 "KangGo"
	IdleTimeout          time.Duration                          // 服务器空闲连接的超时时间
	ReadTimeout          time.Duration                          // 服务器读取请求的超时时间
	WriteTimeout         time.Duration                          // 服务器写入响应的超时时间
	MaxRequestBodySize   int                                    // 最大请求体大小,默认为 4 MB
	CaseSensitiveRouting bool                                   // 路由是否区分大小写,默认区分
	StrictRouting        bool                                   // 是否启用严格路由模式,默认不启用
	UnescapePath         bool                                   // 是否对 URL 路径进行解码处理,默认不处理
}

Config 配置结构体,包含多个配置选项,用户可以根据需要自定义这些选项

func DefaultConfig

func DefaultConfig() Config

DefaultConfig 返回默认的配置 这是框架提供的默认配置,如果用户不提供自定义配置,则使用此配置

type Context

type Context struct {
	Writer  http.ResponseWriter
	Request *http.Request
	Params  map[string]string

	TemplateEngine TemplateEngine
	// contains filtered or unexported fields
}

Context 代表 HTTP 请求的上下文

func NewContext

func NewContext(w http.ResponseWriter, req *http.Request, cfg Config) *Context

NewContext 创建一个新的 Context 实例

func (*Context) BindForm

func (c *Context) BindForm(obj interface{}) error

BindForm 解析表单数据到指定的结构体

func (*Context) BindJSON

func (c *Context) BindJSON(obj interface{}) error

BindJSON 解析 JSON 请求体到指定的对象

func (*Context) DefaultFormValue

func (c *Context) DefaultFormValue(key, defaultValue string) string

DefaultFormValue 获取 POST 表单数据并提供默认值

func (*Context) DefaultQuery

func (c *Context) DefaultQuery(key, defaultValue string) string

DefaultQuery 获取 URL 查询参数并提供默认值

func (*Context) FormValue

func (c *Context) FormValue(key string) string

FormValue 获取 POST 表单数据

func (*Context) JSON

func (c *Context) JSON(code int, obj interface{}) error

JSON 返回一个 JSON 响应

func (*Context) JSONP

func (c *Context) JSONP(callback string, obj interface{}) error

JSONP 返回一个 JSONP 响应

func (*Context) Param

func (c *Context) Param(key string) string

Param 获取路径参数

func (*Context) Query

func (c *Context) Query(key string) string

Query 获取 URL 查询参数

func (*Context) Render added in v1.0.4

func (c *Context) Render(name string, data interface{}) error

Render 渲染模板

func (*Context) SendError

func (c *Context) SendError(code int, message string) error

SendError 返回一个错误响应

func (*Context) SendFile

func (c *Context) SendFile(filepath string, download bool) error

SendFile 发送文件作为响应

func (*Context) SendHTML

func (c *Context) SendHTML(html string) error

SendHTML 返回一个 HTML 响应

func (*Context) SendString

func (c *Context) SendString(msg string) error

SendString 返回一个纯文本响应

type FileRouteInfo

type FileRouteInfo struct {
	Method  string // 新增字段,存储请求方法
	Prefix  string
	Root    string
	Handler HandlerFunc
}

FileRouteInfo 存储文件路由的信息

type Group

type Group struct {
	Prefix string  // 路由组的前缀
	Router *Router // 引用 Router
}

Group 结构定义了一个路由组

func (*Group) Add

func (g *Group) Add(method, pattern string, handlers ...HandlerFunc)

Add 方法允许您指定一个方法作为值来注册一个路由

func (*Group) All

func (g *Group) All(pattern string, handlers ...HandlerFunc)

All 方法将给定路径注册到所有 HTTP 方法

func (*Group) CONNECT

func (g *Group) CONNECT(pattern string, handler HandlerFunc)

CONNECT 方法为路由组注册一个 CONNECT 请求处理函数

func (*Group) DELETE

func (g *Group) DELETE(pattern string, handler HandlerFunc)

DELETE 方法为路由组注册一个 DELETE 请求处理函数

func (*Group) GET

func (g *Group) GET(pattern string, handler HandlerFunc)

GET 方法为路由组注册一个 GET 请求处理函数

func (*Group) HEAD

func (g *Group) HEAD(pattern string, handler HandlerFunc)

HEAD 方法为路由组注册一个 HEAD 请求处理函数

func (*Group) OPTIONS

func (g *Group) OPTIONS(pattern string, handler HandlerFunc)

OPTIONS 方法为路由组注册一个 OPTIONS 请求处理函数

func (*Group) PATCH

func (g *Group) PATCH(pattern string, handler HandlerFunc)

PATCH 方法为路由组注册一个 PATCH 请求处理函数

func (*Group) POST

func (g *Group) POST(pattern string, handler HandlerFunc)

POST 方法为路由组注册一个 POST 请求处理函数

func (*Group) PUT

func (g *Group) PUT(pattern string, handler HandlerFunc)

PUT 方法为路由组注册一个 PUT 请求处理函数

func (*Group) TRACE

func (g *Group) TRACE(pattern string, handler HandlerFunc)

TRACE 方法为路由组注册一个 TRACE 请求处理函数

type HTMLTemplateEngine added in v1.0.4

type HTMLTemplateEngine struct {
	// contains filtered or unexported fields
}

HTMLTemplateEngine 使用 Go 标准库 html/template 的模板引擎

func NewHTMLTemplateEngine added in v1.0.4

func NewHTMLTemplateEngine(dir, pattern string) *HTMLTemplateEngine

NewHTMLTemplateEngine 创建一个新的 HTMLTemplateEngine 实例

func (*HTMLTemplateEngine) Load added in v1.0.4

func (e *HTMLTemplateEngine) Load() error

Load 加载模板文件

func (*HTMLTemplateEngine) Render added in v1.0.4

func (e *HTMLTemplateEngine) Render(w http.ResponseWriter, name string, data interface{}) error

Render 渲染模板

type HandlerFunc

type HandlerFunc func(ctx *Context) error

HandlerFunc 定义处理函数签名

type KangGo

type KangGo struct {
	Router *Router
	Config Config
	// contains filtered or unexported fields
}

KangGo 核心结构

func Default

func Default() *KangGo

Default 创建一个带有默认设置的 KangGo 实例

func New

func New(cfg Config) *KangGo

New 创建一个新的 KangGo 实例

func (*KangGo) Add

func (k *KangGo) Add(method, path string, handlers ...HandlerFunc) *Router

Add 方法允许您指定一个方法作为值来注册一个路由

func (*KangGo) All

func (k *KangGo) All(path string, handlers ...HandlerFunc) *Router

All 方法将给定路径注册到所有 HTTP 方法

func (*KangGo) CONNECT

func (k *KangGo) CONNECT(pattern string, handler HandlerFunc)

CONNECT 注册一个 CONNECT 请求路由

func (*KangGo) DELETE

func (k *KangGo) DELETE(pattern string, handler HandlerFunc)

DELETE 注册一个 DELETE 请求路由

func (*KangGo) GET

func (k *KangGo) GET(pattern string, handler HandlerFunc)

GET 注册一个 GET 请求路由

func (*KangGo) HEAD

func (k *KangGo) HEAD(pattern string, handler HandlerFunc)

HEAD 注册一个 HEAD 请求路由

func (*KangGo) OPTIONS

func (k *KangGo) OPTIONS(pattern string, handler HandlerFunc)

OPTIONS 注册一个 OPTIONS 请求路由

func (*KangGo) PATCH

func (k *KangGo) PATCH(pattern string, handler HandlerFunc)

PATCH 注册一个 PATCH 请求路由

func (*KangGo) POST

func (k *KangGo) POST(pattern string, handler HandlerFunc)

POST 注册一个 POST 请求路由

func (*KangGo) PUT

func (k *KangGo) PUT(pattern string, handler HandlerFunc)

PUT 注册一个 PUT 请求路由

func (*KangGo) Run

func (k *KangGo) Run(addr string) error

Run 启动 HTTP 服务器

func (*KangGo) Static

func (k *KangGo) Static(prefix, root string, config ...StaticConfig) *KangGo

Static 注册一个静态文件服务路由

func (*KangGo) TRACE

func (k *KangGo) TRACE(pattern string, handler HandlerFunc)

TRACE 注册一个 TRACE 请求路由

func (*KangGo) Use

func (k *KangGo) Use(middleware core.MiddlewareFunc)

Use 注册一个中间件

type RadixNode

type RadixNode struct {
	// contains filtered or unexported fields
}

RadixNode 是 Radix Tree 的节点

type RouteInfo

type RouteInfo struct {
	Method  string
	Pattern string
}

RouteInfo 存储动态路由的信息

type Router

type Router struct {
	// contains filtered or unexported fields
}

Router 路由结构

func NewRouter

func NewRouter(cfg Config) *Router

NewRouter 创建一个新的路由器

func (*Router) Handle

func (r *Router) Handle(method, pattern string, handler HandlerFunc)

Handle 注册路由

func (*Router) NewGroup

func (r *Router) NewGroup(prefix string) *Group

NewGroup 创建一个新的路由组

func (*Router) PrintRoutes

func (r *Router) PrintRoutes()

PrintRoutes 打印所有注册的路由信息,区分目录文件路由、单文件路由、普通静态路由和动态路由

func (*Router) RegisterFileRoute

func (r *Router) RegisterFileRoute(method, pattern, root string, handler HandlerFunc)

RegisterFileRoute 注册文件路由信息

func (*Router) RegisterStaticRoute

func (r *Router) RegisterStaticRoute(method, pattern string, handler HandlerFunc)

RegisterStaticRoute 注册普通静态路由信息

func (*Router) ServeHTTP

func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request)

ServeHTTP 实现 http.Handler 接口

func (*Router) Use

func (r *Router) Use(mw core.MiddlewareFunc)

Use 方法注册中间件到路由器

type StaticConfig

type StaticConfig struct {
	Compress       bool                                     // 是否启用压缩,减少传输体积,默认值 false
	ByteRange      bool                                     // 是否支持字节范围请求,默认值 false
	Browse         bool                                     // 是否启用目录浏览,允许用户查看文件夹中的内容,默认值 false
	Download       bool                                     // 是否启用文件下载,启用后所有文件将以附件形式下载,默认值 false
	Index          string                                   // 用于提供目录的索引文件的名称,例如 "index.html",默认值为 "index.html"
	CacheDuration  time.Duration                            // 非活动文件处理程序的缓存持续时间,使用负值禁用此选项,默认值 10 秒
	MaxAge         int                                      // 设置文件响应的 Cache-Control HTTP 头的值,MaxAge 以秒为单位,默认值 0
	ModifyResponse func(http.ResponseWriter, *http.Request) // 自定义函数,允许修改响应,默认值为 nil
	Next           func(*Context) bool                      // 定义一个函数,当返回 true 时跳过此中间件,默认值为 nil
}

StaticConfig 配置结构体,定义静态文件服务的选项

func NewStaticConfig

func NewStaticConfig() StaticConfig

NewStaticConfig 返回一个带有默认值的 StaticConfig 配置实例

type StaticRouteInfo

type StaticRouteInfo struct {
	Method  string // 新增字段,存储请求方法
	Prefix  string
	Handler HandlerFunc
}

StaticRouteInfo 存储普通静态路由的信息

type TemplateEngine added in v1.0.4

type TemplateEngine interface {
	Load() error                                                       // 加载模板文件
	Render(w http.ResponseWriter, name string, data interface{}) error // 渲染模板
}

TemplateEngine 定义模板引擎接口

type TextTemplateEngine added in v1.0.4

type TextTemplateEngine struct {
	// contains filtered or unexported fields
}

TextTemplateEngine 使用 Go 标准库 text/template 的模板引擎

func NewTextTemplateEngine added in v1.0.4

func NewTextTemplateEngine(dir, pattern string) *TextTemplateEngine

NewTextTemplateEngine 创建一个新的 TextTemplateEngine 实例

func (*TextTemplateEngine) Load added in v1.0.4

func (e *TextTemplateEngine) Load() error

Load 加载模板文件

func (*TextTemplateEngine) Render added in v1.0.4

func (e *TextTemplateEngine) Render(w http.ResponseWriter, name string, data interface{}) error

Render 渲染模板

Directories

Path Synopsis
middleware

Jump to

Keyboard shortcuts

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