首页 > 解决方案 > 如何处理迭代器的类型?

问题描述

我有以下代码:

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++ {

因为我相信在循环中的底层初始化迭代器是非常优化的,并且在之前声明一个迭代器也不是最好的解决方案。
最好的实现是什么?

标签: for-loopgotypes

解决方案


你可以声明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
}

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


推荐阅读