我有以下代码:

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()uint8类型的值,也可以在声明循环变量时使用类型化的常量,因此i将为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上尝试一下。

您也可以使用shift运算符而不是除以8:
func getRank(i uint8) uint8 {
    return i >> 3
}

但这是编译器最有可能识别和使用的微优化。因此,请使用在您的上下文中更具表现力的方法。

关于for-loop - 如何处理迭代器的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54852331/

10-10 14:17
查看更多