golang error 枚举

本文介绍了一种在Golang中实现异常枚举的方法,利用iota为异常代码分配值,并通过ErrorModel数组来存储异常信息,使得异常处理更为直观且易于维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### Golang 中迭代器的实现与用法 #### 迭代器模式简介 迭代器模式提供了一种方法来顺序访问聚合对象中的各个元素,而无需暴露其内部表示。通过封装遍历逻辑,迭代器使得客户端可以一致地处理不同类型的集合。 #### 实现区块链迭代器的例子 下面展示了一个具体的例子——基于区块链数据结构的迭代器实现[^3]: ```go type BlockchainIterator struct { currentHash []byte db *bolt.DB } func (i *BlockchainIterator) Next() *Block { var block *Block // 使用事务读取当前哈希对应的区块 err := i.db.View(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte(blocksBucket)) encodedBlock := bucket.Get(i.currentHash) // 反序列化获取到的数据为 Block 对象 block = DeserializeBlock(encodedBlock) return nil }) if err != nil { log.Fatal(err) } // 更新下一个要访问的区块哈希值 i.currentHash = block.PrevBlockHash return block } ``` 此代码片段展示了如何创建一个 `BlockchainIterator` 类型以及它的成员函数 `Next()` 来逐步返回链上的每一个区块实例直到起始位置为止。 #### 自定义容器类的迭代器接口设计 为了更好地理解通用情况下的迭代器,在自定义容器类型上也可以应用类似的思路。这里给出一个简单的列表(slice)作为底层存储介质并为其构建迭代器的方式: ```go // 定义 List 和 Iterator 接口 type List interface { Get(index int) interface{} Len() int } type Iterator interface { HasNext() bool Next() interface{} } // SliceList 是实现了 List 接口的具体类型 type SliceList []interface{} func (l SliceList) Get(index int) interface{} { if index >= 0 && index < l.Len() { return (*reflect.ValueOf(&l).Elem().Index(index)).Interface() } panic("index out of range") } func (l SliceList) Len() int { return len(l) } // SliceIterator 构建于 SliceList 上面的一个简单迭代器 type SliceIterator struct { list List position int } func NewSliceIterator(list List) *SliceIterator { return &SliceIterator{list: list, position: -1} // 初始化指向前驱节点之前的位置(-1) } func (it *SliceIterator) HasNext() bool { return it.position+1 < it.list.Len() } func (it *SliceIterator) Next() interface{} { if !it.HasNext() { panic("no more elements to iterate over") } it.position++ element := it.list.Get(it.position) return element } ``` 上述代码中定义了两个主要组件:一个是代表可枚举集合的抽象类型 `List`;另一个则是用于遍历这些项目的工具 `Iterator` 。对于任意给定的支持这两种操作的对象来说都可以方便地生成相应的迭代行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值