- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
05.9.3 使用 container/ring
使用 container/ring
这一节中将使用 conRing.go
中的 Go 语言代码阐述 container/ring
包的用法,下面分为四个部分介绍。注意,container/ring
比 container/list
和 container/heap
都简单多了,也就是说这个包中的函数比另外两个包中的要少一些。
conRing.go
中的第一个代码段如下:
package main
import (
"container/ring"
"fmt"
)
var size int = 10
size
变量存储了要创建的环的大小。
conRing.go
的第二部分包含如下 Go 代码:
func main() {
myRing := ring.New(size + 1)
fmt.Println("Empty ring:", *myRing)
for i := 0; i < myRing.Len()-1; i++ {
myRing.Value = i
myRing = myRing.Next()
}
myRing.Value = 2
从上面可知,创建新的环需要使用 ring.New()
函数,它需要接受一个提供环的大小的参数。最后的 myRing.Value = 2
语句向环中加入了 2 这个值。不过前面的 for
循环中已经向环中加入了那个值。最后,环的零值指的是只有一个值为 nil
的元素的环。
conRing.go
的第三部分如下:
sum := 0
myRing.Do(func(x interface{}) {
t := x.(int)
sum = sum + t
})
fmt.Println("Sum:", sum)
ring.Do()
函数可以对环上的每个元素依次调用一个函数。然而 ring.Do()
没有定义对环进行修改的行为。x.(int)
语句称为类型断言。第 7 章“反射和接口”中将详细介绍类型断言。目前,你只用知道这表示 x
是 int
类型的就行了。
conRing.go
的最后一部分程序如下:
for i := 0; i < myRing.Len()+2; i++ {
myRing = myRing.Next()
fmt.Print(myRing.Value, " ")
}
fmt.Println()
}
使用环会遇到的唯一的问题就是你可以无限调用 ring.Next()
,所以你需要找到停下来的办法。这种情况下就需要用到 ring.Len()
函数。就个人而言,我比较倾向于使用 ring.Do()
函数来迭代环上的所有元素,因为这样代码更简洁,但用 for
循环其实也不错!
执行 conRing.go
将会生成如下输出:
$ go run conRing.go
Empty ring: {0x42000a080 0xc42000a1a0 <nil>}
Sum: 47
0 1 2 3 4 5 6 7 8 9 2 0 1
输出的结果证明环上可以存在重复的值,也就是说你只能通过 ring.Len()
函数才能安全地获取到环的大小。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论