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中,用起来是不是很方便。
但是如果异常枚举列表位置需要调换,就很蛋疼了。
相关推荐
介绍枚举是生成枚举结构的工具安装go install github.com/Natata/enum如何使用写枚举文件文件格式type: [int|string]name: [package name]list: [enum element] = [value]文件名无关紧要产生enum.go enum -fp=exam....
Golang error具有的一切 - 它是一个替代品,因为它实现了error接口 Golang errors包提供的一切 您可以将 JSON 错误写入您的网络处理程序 文档 示例输出 json,嵌套错误,详细信息:跟踪 { " error_code " : 10 , ...
:bookmark_tabs: Golang Enumerators :bookmark_tabs: 什么 Enum是一个软件包,为Go提供简单的枚举器,并具有IDE自动补全功能和任何类型的支持。它可能不是最漂亮的语法,但它是如此有用。 安装 go get github....
Golang IPv6地址枚举ipv666注意-该软件先前已获得GPLv3许可,此后已更新为BSD。 ipv666是一组工具,可用于在全局IPv6地址空间和更窄的IPv6网络范围中发现IPv6地址。 这些工具被设计为在开箱即用的情况下,对其工作...
golang中文手册.chm,学习golang语言的字典,一典在手,天下我有
golang中文手册.rar
golang解析数字证书 PKCS#1 PKCS#8格式的私钥
在Centos7安装golang教程
golang开发modbus rtu实例,使用golang与Modbus Slave软件进行模拟测试。
golang_http_client
Golang 1.18.10 Windows安装包。Golang 1.18.10 Windows安装包。Golang 1.18.10 Windows安装包。Golang 1.18.10 Windows安装包。Golang 1.18.10 Windows安装包。Golang 1.18.10 Windows安装包。Golang 1.18.10 ...
golang 1.14.2 mips 龙芯版,用于龙芯系列处理器的专属预编译golang语言sdk开发包,因为golang官方默认不提供golang语言的龙芯处理器版本,大家都需要自己从头编译golang才能在龙芯机器里面用,这个是提前打包好的,...
golang-odbc 驱动
golang提取office文件内容,可以支持正常office文件内容格式,可以很好的提取标点以及内在格式内容
golang 敏感词过滤
golang使用bass.dll播放mp3文件
golang 中文离线文档,直接解压,运行pkgdoc.exe后,会跳出本地文档地址,默认127.0.0.1:9999
Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言。Python很适合让搞算法的写写模型,而Golang很适合提供API服务,两位同志都红的发紫,这里就介绍一下正确搅基的办法。 go 中的 cgo 模块...
golang函数查询手册.chm
Golang实现HTML转PDF