<commit_before># Thinkgo    [![GoDoc](https://godoc.org/github.com/tsuna/gohbase?status.png)](https://godoc.org/github.com/henrylee2cn/thinkgo)    ![Thinkgo goreportcard](https://goreportcard.com/badge/github.com/henrylee2cn/thinkgo)

![Thinkgo Favicon](https://github.com/henrylee2cn/thinkgo/raw/master/doc/thinkgo_96x96.png)

## 概述
Thinkgo以全新的架构实现，它面向Handler接口开发，支持智能参数映射与校验、支持自动化API文档的Go语言web框架。

官方QQ群：Go-Web 编程 42730308    [![Go-Web 编程群](http://pub.idqqimg.com/wpa/images/group.png)](http://jq.qq.com/?_wv=1027&k=fzi4p1)

![thinkgo server](https://github.com/henrylee2cn/thinkgo/raw/master/doc/server.png)

![thinkgo apidoc](https://github.com/henrylee2cn/thinkgo/raw/master/doc/apidoc.png)

![thinkgo index](https://github.com/henrylee2cn/thinkgo/raw/master/doc/index.png)

## 最新版本

### 版本号
v1.0

### 安装要求
Go Version ≥1.6

## 快速使用

### 框架下载

```sh
go get -u -v github.com/henrylee2cn/thinkgo
```

### 简单示例
```
package main

import (
    "github.com/henrylee2cn/thinkgo"
    "time"
)

type Index struct {
    Id        int      `param:"<in:path> <required> <desc:ID> <range: 0:10>"`
    Title     string   `param:"<in:query> <nonzero>"`
    Paragraph []string `param:"<in:query> <name:p> <len: 1:10> <regexp: ^[\\w]*$>"`
    Cookie    string   `param:"<in:cookie> <name:thinkgoID>"`
    // Picture         multipart.FileHeader `param:"<in:formData> <name:pic> <maxmb:30>"`
}

func (i *Index) Serve(ctx *thinkgo.Context) error {
    if ctx.CookieParam("thinkgoID") == "" {
        ctx.SetCookie("thinkgoID", time.Now().String())
    }
    return ctx.JSON(200, i)
}

func main() {
  app := thinkgo.New("myapp", "0.1")

  // Register the route in a chain style
  app.GET("/index/:id", new(Index))

  // Register the route in a tree style
  // app.Route(
  //   app.NewGET("/index/:id", new(Index)),
  // )

  // Start the service
  app.Run()
}

/*
http GET:
    http://localhost:8080/index/1?title=test&p=abc&p=xyz
response:
    {
      "Id": 1,
      "Title": "test",
      "Paragraph": [
        "abc",
        "xyz"
      ],
      "Cookie": "2016-11-13 01:14:40.9038005 +0800 CST"
    }
*/
```
[示例库](https://github.com/henrylee2cn/thinkgo/raw/master/samples)

## 框架特性

- 面向Handler接口开发（func or struct），中间件与操作完全等同可任意拼接路由操作链
- 支持用struct Handler在Tag标签定义请求参数信息及其校验信息
- 由struct Handler自动构建API文档（swagger2.0）
- 支持HTTP/HTTP2、HTTPS(tls/letsencrypt)、UNIX多种Server类型
- 支持多实例运行，且配置信息相互独立
- 支持同一实例监听多Server类型、多端口
- 基于著名的httprouter构建路由器，且支持链式与树形两种路由注册风格
- 强大的文件路由功能，支持自定义文件系统，框架提供快捷的DirFS、RenderFS、MarkdownFS等
- 提供近似LRU的文件缓存功能
- 跨平台的彩色日志系统，且同时支持console和file两种输出形式（可以同时使用）
- 提供Session管理功能
- 支持Gzip全局配置
- 提供XSRF跨站请求伪造安全过滤
- 简单整洁的配置文件，且自动补填默认值方便设置




## 配置文件说明

- 应用的各实例均有单独一份配置，其文件名格式 `config/{appname}[_{version}].ini`，配置详情：

```
net_types              = normal|tls              # 多种Server类型列表，支持 normal | tls | letsencrypt | unix
addrs                  = 0.0.0.0:80|0.0.0.0:443  # 多个监听地址列表
tls_certfile           =                         # TLS证书文件路径
tls_keyfile            =                         # TLS密钥文件路径
letsencrypt_file       =                         # SSL免费证书路径
unix_filemode          = 438                     # UNIX Server的文件权限（438即0666）
read_timeout           = 0                       # 读取请求数据超时
write_timeout          = 0                       # 写入响应数据超时
multipart_maxmemory_mb = 32                      # 接收上传文件时允许使用的最大内存

[router]                                         # 路由配置区
redirect_trailing_slash   = true                 # 当前请求的URL含`/`后缀如`/foo/`且相应路由不存在时，如存在`/foo`，则自动跳转至`/foo`
redirect_fixed_path       = true                 # 自动修复URL，如`/FOO` `/..//Foo`均被跳转至`/foo`（依赖redirect_trailing_slash=true）
handle_method_not_allowed = true                 # 若开启，当前请求方法不存在时返回405，否则返回404
handle_options            = true                 # 若开启，自动应答OPTIONS类请求，可在Thinkgo中设置默认Handler<commit_msg>Update README_ZH.md<commit_after># Thinkgo    [![GoDoc](https://godoc.org/github.com/tsuna/gohbase?status.png)](https://godoc.org/github.com/henrylee2cn/thinkgo)    ![Thinkgo goreportcard](https://goreportcard.com/badge/github.com/henrylee2cn/thinkgo)

![Thinkgo Favicon](https://github.com/henrylee2cn/thinkgo/raw/master/doc/thinkgo_96x96.png)

## 概述
Thinkgo以全新的架构实现，它面向Handler接口开发，是支持智能参数映射与校验、支持自动化API文档的Go语言web框架。

官方QQ群：Go-Web 编程 42730308    [![Go-Web 编程群](http://pub.idqqimg.com/wpa/images/group.png)](http://jq.qq.com/?_wv=1027&k=fzi4p1)

![thinkgo server](https://github.com/henrylee2cn/thinkgo/raw/master/doc/server.png)

![thinkgo apidoc](https://github.com/henrylee2cn/thinkgo/raw/master/doc/apidoc.png)

![thinkgo index](https://github.com/henrylee2cn/thinkgo/raw/master/doc/index.png)

## 最新版本

### 版本号
v1.0

### 安装要求
Go Version ≥1.6

## 快速使用

### 框架下载

```sh
go get -u -v github.com/henrylee2cn/thinkgo
```

### 简单示例
```
package main

import (
    "github.com/henrylee2cn/thinkgo"
    "time"
)

type Index struct {
    Id        int      `param:"<in:path> <required> <desc:ID> <range: 0:10>"`
    Title     string   `param:"<in:query> <nonzero>"`
    Paragraph []string `param:"<in:query> <name:p> <len: 1:10> <regexp: ^[\\w]*$>"`
    Cookie    string   `param:"<in:cookie> <name:thinkgoID>"`
    // Picture         multipart.FileHeader `param:"<in:formData> <name:pic> <maxmb:30>"`
}

func (i *Index) Serve(ctx *thinkgo.Context) error {
    if ctx.CookieParam("thinkgoID") == "" {
        ctx.SetCookie("thinkgoID", time.Now().String())
    }
    return ctx.JSON(200, i)
}

func main() {
  app := thinkgo.New("myapp", "0.1")

  // Register the route in a chain style
  app.GET("/index/:id", new(Index))

  // Register the route in a tree style
  // app.Route(
  //   app.NewGET("/index/:id", new(Index)),
  // )

  // Start the service
  app.Run()
}

/*
http GET:
    http://localhost:8080/index/1?title=test&p=abc&p=xyz
response:
    {
      "Id": 1,
      "Title": "test",
      "Paragraph": [
        "abc",
        "xyz"
      ],
      "Cookie": "2016-11-13 01:14:40.9038005 +0800 CST"
    }
*/
```
[示例库](https://github.com/henrylee2cn/thinkgo/raw/master/samples)

## 框架特性

- 面向Handler接口开发（func or struct），中间件与操作完全等同可任意拼接路由操作链
- 支持用struct Handler在Tag标签定义请求参数信息及其校验信息
- 支持自动构建API文档（swagger2.0）
- 支持HTTP/HTTP2、HTTPS(tls/letsencrypt)、UNIX多种Server类型
- 支持多实例运行，且配置信息相互独立
- 支持同一实例监听多Server类型、多端口
- 基于高性能路由httprouter构建，支持链式与树形两种路由信息注册风格
- 强大的文件路由功能，支持自定义文件系统，框架提供快捷的DirFS、RenderFS、MarkdownFS等
- 提供近似LRU的文件缓存功能
- 跨平台的彩色日志系统，且同时支持console和file两种输出形式（可以同时使用）
- 提供Session管理功能
- 支持Gzip全局配置
- 提供XSRF跨站请求伪造安全过滤
- 简单整洁的配置文件，且自动补填默认值方便设置




## 配置文件说明

- 应用的各实例均有单独一份配置，其文件名格式 `config/{appname}[_{version}].ini`，配置详情：

```
net_types              = normal|tls              # 多种Server类型列表，支持 normal | tls | letsencrypt | unix
addrs                  = 0.0.0.0:80|0.0.0.0:443  # 多个监听地址列表
tls_certfile           =                         # TLS证书文件路径
tls_keyfile            =                         # TLS密钥文件路径
letsencrypt_file       =                         # SSL免费证书路径
unix_filemode          = 438                     # UNIX Server的文件权限（438即0666）
read_timeout           = 0                       # 读取请求数据超时
write_timeout          = 0                       # 写入响应数据超时
multipart_maxmemory_mb = 32                      # 接收上传文件时允许使用的最大内存

[router]                                         # 路由配置区
redirect_trailing_slash   = true                 # 当前请求的URL含`/`后缀如`/foo/`且相应路由不存在时，如存在`/foo`，则自动跳转至`/foo`
redirect_fixed_path       = true                 # 自动修复URL，如`/FOO` `/..//Foo`均被跳转至`/foo`（依赖redirect_trailing_slash=true）
handle_method_not_allowed = true                 # 若开启，当前请求方法不存在时返回405，否则返回404
handle_options            = true                 # 若开启，自动应答OPTIONS类请求，可在Thinkgo中设置默认Handler
{'fraction_non_alphanumeric': 0.15067229106248353, 'fraction_numerical': 0.029264434484576853, 'mean_word_length': 2.675872093023256, 'pattern_counts': {'":': 8, '<': 33, '<?xml version=': 0, '>': 33, 'https://': 16, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 4, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 16, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6736801', 'n_tokens_mistral': 3635, 'n_tokens_neox': 3721, 'n_words': 391}