go error 扩展

zld1234567 · 2016-01-08 09:42:20 · 2845 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2016-01-08 09:42:20 的主题,其中的信息可能已经有所发展或是发生改变。

golang没有提供枚举支持,但是枚举在一些业务场景中却是十分重要的。举个简单的例子:发表帖子,需要对帖子做一些校验。这时我们可能就需要定义一些异常变量,这些常量自然是维护在枚举中语意更强,使用更加灵活。下面我简单介绍一下 http://www.threeperson.com 异常枚举实现思路。

iota 给const绑定序列值


type ErrorCode int

const (
    INTERNAL_ERROR ErrorCode = 1 + iota
    NOT_LOGIN
    NOT_EXIST_ARTICLE_ERROR
    ARTICLE_TITLE_LEN_OVERFLOW
    ARTICLE_CATEGORY_LEN_OVERFLOW
    ARTICLE_TAG_LEN_OVERFLOW
    ARTICLE_CONTENT_LEN_OVERFLOW
)

`

这里定义了一些异常常量,通过iota使常量值自增1.

定义ErrorModel,初始化一个异常modle数组


type ErrorModel struct {
    Code    int
    Message string
}

var errorCodes = [...]ErrorModel{
    ErrorModel{Code:-1, Message:"系统内部错误"},
    ErrorModel{Code:1000, Message:"未登录"},
    ErrorModel{Code:1001, Message:"文章不存在"},
    ErrorModel{Code:1002, Message:"文章标题太长"},
    ErrorModel{Code:1003, Message:"文章分类太长"},
    ErrorModel{Code:1004, Message:"文章标题太长"},
    ErrorModel{Code:1005, Message:"文章内容太长"},
}

给ErrorCode 绑定函数,并实现error 接口


func (c ErrorCode) Code() int {
    return errorCodes[c - 1].Code
}

func (c ErrorCode) Error() string {
    return errorCodes[c - 1].Message
}

这里实现了Error 接口,ErrorCode 就变成了error 实现,使用时就可以面向接口去编程

使用实例


func ValidArticle(a entities.Article) (error, bool) {

    var title = a.Title
    var category = a.Categories;
    var tag = a.Tags;
    var content = a.Content

    var titleMaxLen = ParameterIntValue("article_title_max_length")
    var categoryMaxLen = ParameterIntValue("article_categories_max_length")
    var tagMaxLen = ParameterIntValue("article_tags_max_length")
    var contentMaxLen = ParameterIntValue("article_content_max_length")

    if len(title) > titleMaxLen {
        return exception.ARTICLE_TITLE_LEN_OVERFLOW, false
    }

    if len(category) > categoryMaxLen {
        return exception.ARTICLE_CATEGORY_LEN_OVERFLOW, false
    }

    if len(tag) > tagMaxLen {
        return exception.ARTICLE_TAG_LEN_OVERFLOW, false
    }

    if len(content) > contentMaxLen {
        return exception.ARTICLE_CONTENT_LEN_OVERFLOW, false
    }

    return nil, true

}

这是一个文章内容长度校验函数,异常常量维护在enum error中,用起来是不是很方便。 但是如果异常枚举列表位置需要调换,就很蛋疼了。

转载请注明出处:http://threeperson.com/articles/2061


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2845 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传