实现数组或切片的迭代器
这里,我用的是顺序表的数据结构,下面会放上数组和切片的。
type db struct{
DbData []interface{}
DbSize int
}
// 作者:itruirui@outlook.com
package main
import (
"fmt"
"errors"
)
type db struct{
DbData []interface{}
DbSize int
}
type p interface{
HasNext()(bool)
Next()(interface{}, error)
}
type sj struct{
SjData *db
SjSize int
}
func main(){
fmt.Println("生成一个切片:")
d := new(db)
d.DbData = append(d.DbData, 1)
d.DbSize++
d.DbData = append(d.DbData, 2)
d.DbSize++
d.DbData = append(d.DbData, 3)
d.DbSize++
d.DbData = append(d.DbData, 4)
d.DbSize++
d.DbData = append(d.DbData, 5)
d.DbSize++
fmt.Println(d)
fmt.Println("===========================================================")
fmt.Println("开始迭代输出数据:")
for s := d.returnp(); s.HasNext();{
data, _ := s.Next()
fmt.Print(data, "\t")
}
}
func (s *sj)HasNext()(bool){
return s.SjData.DbSize > s.SjSize
}
func (s *sj)Next()(interface{}, error){
if !s.HasNext(){
return nil, errors.New("没有下一个元素了")
}
value := s.SjData.DbData[s.SjSize]
s.SjSize++
return value, nil
}
func (d *db)returnp()(p){
s := new(sj)
s.SjData = d
s.SjSize = 0
return s
}
这里是数组的迭代器实现
// 作者:itruirui@outlook.com
package main
import (
"fmt"
"errors"
)
func main(){
numbers := [10]int{1, 3, 5, 7, 9, 2, 4, 6, 8, 10}
s := sj{&numbers, 0}
for ;s.HasNext();{
value, _ := s.Next()
fmt.Print(value, "\t")
}
}
type sj struct{
db *[10]int
size int
}
func (s *sj)HasNext()(bool){
return len(s.db) > s.size
}
func (s *sj)Next()(interface{}, error){
if !s.HasNext(){
return nil, errors.New("没有下一个元素了")
}
value := s.db[s.size]
s.size++
return value, nil
}
这里是切片的迭代器实现
值得注意的是,我这里用指针访问切片的元素,用的
(*s.db)[s.size]
来访问切片元素的。
// 作者:itruirui@outlook.com
package main
import (
"fmt"
"errors"
)
func main(){
numbers := []int{1, 3, 5, 7, 9, 2, 4, 6, 8, 10}
s := sj{&numbers, 0}
for ;s.HasNext();{
value, _ := s.Next()
fmt.Print(value, "\t")
}
}
type sj struct{
db *[]int
size int
}
func (s *sj)HasNext()(bool){
return len(*s.db) > s.size
}
func (s *sj)Next()(interface{}, error){
if !s.HasNext(){
return nil, errors.New("没有下一个元素了")
}
value := (*s.db)[s.size]
s.size++
return value, nil
}