0 Star 0 Fork 41

景德真人/lessgo

forked from andeyalee/lessgo 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
virthandler.go 3.37 KB
一键复制 编辑 原始数据 按行查看 历史
henrylee2cn 提交于 2016-04-09 15:20 . 调整DescHandler的字段
package lessgo
import (
"path"
"reflect"
"runtime"
"strings"
"sync"
)
// 虚拟操作
type VirtHandler struct {
id string // 操作的唯一标识符
methods []string // 方法列表
prefix string // 路由节点的url前缀(或含参数)
prefixPath string // 路由节点的url前缀的固定路径部分
prefixParam string // 路由节点的url前缀的参数部分
description string // 描述
param map[string]string // 参数描述
lock sync.Mutex
}
var (
// 防止VirtHandler的id重复
virtHandlerMap = map[string]*VirtHandler{}
virtHandlerLock sync.RWMutex
)
func GetVirtHandler(id string) (*VirtHandler, bool) {
virtHandlerLock.RLock()
defer virtHandlerLock.RUnlock()
vh, ok := virtHandlerMap[id]
return vh, ok
}
// 创建全局唯一、完整的VirtHandler
func NewVirtHandler(
handlerfunc HandlerFunc,
prefix string,
methods []string,
description, success, failure string,
param map[string]string,
) *VirtHandler {
prefix, prefixPath, prefixParam := creatPrefix(prefix)
id := handleWareUri(handlerfunc, methods, prefix)
v := &VirtHandler{
id: id,
methods: methods,
prefix: prefix,
prefixPath: prefixPath,
prefixParam: prefixParam,
description: description,
param: param,
}
if hasVirtHandler(id) {
return virtHandlerMap[id]
}
setVirtHandler(v)
setHandlerMap(id, handlerfunc)
return v
}
// 返回虚拟操作列表的副本
func (v *VirtHandler) Methods() []string {
ms := make([]string, len(v.methods))
copy(ms, v.methods)
return ms
}
// 虚拟操作的id
func (v *VirtHandler) Id() string {
return v.id
}
// 操作的url前缀
func (v *VirtHandler) Prefix() string {
return v.prefix
}
// 操作的url前缀的固定路径部分
func (v *VirtHandler) PrefixPath() string {
return v.prefixPath
}
// 操作的url前缀的参数部分
func (v *VirtHandler) PrefixParam() string {
return v.prefixParam
}
// 操作的描述
func (v *VirtHandler) Description() string {
return v.description
}
// 操作的参数描述的副本
func (v *VirtHandler) Param() map[string]string {
p := make(map[string]string, len(v.param))
for key, val := range v.param {
p[key] = val
}
return p
}
func setVirtHandler(vh *VirtHandler) {
virtHandlerLock.Lock()
defer virtHandlerLock.Unlock()
virtHandlerMap[vh.id] = vh
}
func hasVirtHandler(id string) bool {
virtHandlerLock.RLock()
defer virtHandlerLock.RUnlock()
_, ok := virtHandlerMap[id]
return ok
}
// 清洗并拆分固定路径与参数
func creatPrefix(prefix string) (cleanPrefix, prefixPath, prefixParam string) {
cleanPrefix = path.Clean(path.Join("/", prefix))
cleanPrefix = strings.Split(cleanPrefix, "?")[0]
s := strings.Split(cleanPrefix, "/:")
prefixPath = s[0]
if len(s) > 1 {
prefixParam = "/:" + strings.Join(s[1:], "/:")
}
return
}
func handleWareUri(hw interface{}, methods []string, prefix string) string {
add := "[" + prefix + "]"
for _, m := range methods {
add += "[" + m + "]"
}
t := reflect.ValueOf(hw).Type()
if t.Kind() == reflect.Func {
return runtime.FuncForPC(reflect.ValueOf(hw).Pointer()).Name() + add
}
return t.String() + add
}
// 全部handler及其id
var handlerMap = map[string]HandlerFunc{}
func getHandlerMap(id string) HandlerFunc {
return handlerMap[id]
}
func setHandlerMap(id string, handler HandlerFunc) {
handlerMap[id] = handler
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/szpzs/lessgo.git
git@gitee.com:szpzs/lessgo.git
szpzs
lessgo
lessgo
master

搜索帮助