`

golang error 枚举

阅读更多

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

 

#### 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/2060

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics