for-loop - 如何处理迭代器的类型?
问题描述
我有以下代码:
func generateBoard() {
for i := 0; i < 64; i++ {
}
}
func getRank(i int) uint8 {
return i / 8
}
在我想调用的循环中getRank(i)
。我想要getRank
返回uint8
,因为它是最小的整数类型,我不需要更多。问题是我不能int
除以uint8
. 我不想强制i
转换,uint8
因为它可能很昂贵(甚至可能在那里发生分配)。我也不想像循环之前那样i
声明:uint8
var i uint8
for i = 0; i < 64; i++ {
因为我相信在循环中的底层初始化迭代器是非常优化的,并且在之前声明一个迭代器也不是最好的解决方案。
最好的实现是什么?
解决方案
你可以声明getRank()
取一个 type 的值uint8
,也可以在声明循环变量时使用一个类型化的常量,所以i
将是 type uint8
:
func generateBoard() {
for i := uint8(0); i < 64; i++ {
fmt.Println(getRank(i)) // Valid
}
}
func getRank(i uint8) uint8 {
return i / 8
}
在Go Playground上尝试一下。
您也可以使用移位运算符而不是除以 8:
func getRank(i uint8) uint8 {
return i >> 3
}
但这是编译器最有可能识别和使用的微优化。因此,请使用在您的上下文中更具表现力的那个。
推荐阅读
- powershell - 循环浏览outlook中的文件夹存档中的邮箱并获取powershell中的所有项目
- android - CameraX 分析分辨率太低 (640x480) 但 Camera2 可以做得更好 (720x1280)
- ruby - 用 git 更新 CFBundleVersion
- menu - 电子.js | 移除新的窗框
- flutter - 参数类型“RequestOptions”不能分配给参数类型“Options”
- azure - 如何将本地 Docker 映像部署到 Azure 应用服务?
- git - 从 Git 中的所有分支获取所有文件和文件夹
- video - 什么是 hls.js 比特率?
- python - 使用 Python 从网站获取链接(初学者)
- nginx - Nginx 服务器不使用斜杠