我有以下代码:
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++ {
因为我认为在底层低级别的迭代器上进行了相当优化,并且在之前声明迭代器也不是最佳解决方案。
最好的实现方式是什么?
答案 0 :(得分:2)
您可以声明getRank()
为uint8
类型的值,并且在声明循环变量时也可以使用类型化常量,因此i
的类型为{{1 }}:
uint8
在Go Playground上尝试。
您还可以使用shift运算符而不是除以8:
func generateBoard() {
for i := uint8(0); i < 64; i++ {
fmt.Println(getRank(i)) // Valid
}
}
func getRank(i uint8) uint8 {
return i / 8
}
但是这是编译器最有可能识别和使用的微优化。因此,请根据您的情况使用更具表现力的方式。