将不同资料物件透过一致的方式取得其中的元素
string
与[]string
是两种不同的资料型态,我们需要迭代里头全部的元素。
设计一个Iterator
interface 介面,里头.HasNext()
用来确认是否还拥有下一个元素,.Next()
用来取得元素与把元素 index 往後移。
将string
与[]string
以IterableString{}
、IterableSliceString{}
实作Iterator
interface,PrintAllItems()
依赖此 interface 将元素印出。
相关的 code 在Github - go-design-patterns
code 如下:
package main
import "fmt"
type Iterator interface {
HasNext() bool
Next() interface{}
}
type IterableSliceString []string
func (i IterableSliceString) Iterator() Iterator {
return &SliceStringIterator{
original: i,
index: 0,
}
}
type SliceStringIterator struct {
original IterableSliceString
index int
}
func (s *SliceStringIterator) HasNext() bool {
return s.index < len(s.original)
}
func (s *SliceStringIterator) Next() interface{} {
item := s.original[s.index]
s.index++
return item
}
type IterableString string
func (i IterableString) Iterator() Iterator {
return &StringIterator{
original: i,
index: 0,
}
}
type StringIterator struct {
original IterableString
index int
}
func (s *StringIterator) HasNext() bool {
return s.index < len(s.original)
}
func (s *StringIterator) Next() interface{} {
item := string(s.original[s.index])
s.index++
return item
}
func PrintAllItems(iterator Iterator) {
for iterator.HasNext() {
fmt.Println(iterator.Next())
}
}
func main() {
PrintAllItems(IterableSliceString{"a", "b", "c"}.Iterator())
PrintAllItems(IterableString("abcd").Iterator())
}
需注意的是,golang 已经有range
关键字可以迭代string
、map
、slice
等型态,但 Iterator Pattern 不限定这些型态,而是任意型态只要满足Iterator
interface 的实作即可,例如 golang database/sql
的.Next()
就是以 Iterator Pattern 对 rows 一个一个迭代。
昨天介绍了 OrderCreate,今天会把另外两个都介绍完! OrderQuery 主要功能:查询...
for、while 可参考:Day13 - 回圈(01) 还蛮常搭配阵列使用的 for (初始值 ;...
大家好,我是西瓜,你现在看到的是 2021 iThome 铁人赛『如何在网页中绘制 3D 场景?从 ...
TiDB里头的TiDB,听起来有点饶舌,为了避免混淆,後面会加个server来做区别。TiDB se...
我们可以在开发环境中使用 <React.StrictMode>进入严格模式 严格模式帮...