迭代边界与数据类型相同

时间:2015-04-26 16:06:56

标签: go overflow

我有一个函数 min max uint16参数,并且在某些时候迭代数值范围。但是,如果 max 恰好是 2 ^ 16-1 (并且它是一个有效的用例),则溢出会破坏循环逻辑。以下示例代码演示了uint8

的问题
package main

import "fmt"

func iter(min, max uint8) {
    for i := min; i <= max; i++ {
        fmt.Printf("%d, ", i)
    }
}

func main() {
    iter(0, 255)
}

如您所见,该计划永远不会结束。在another question处提出了类似的问题,但解决方案确实表现出我遇到的同样问题。

我现在的想法是将循环变量转换为uint32,类似于:

package main

import "fmt"

func iter(min, max uint8) {
    for i := uint16(min); i <= uint16(max); i++ {
        fmt.Printf("%d, ", i)
    }
}

func main() {
    iter(0, 255)
}

然而,这似乎是一个笨拙的解决方案,它不适用于uint64或任何最大的uintN类型。感觉像我错过了一些非常基本的东西。指导?

我知道Brad Fitz's Iter solution,但它似乎增加了不必要的开销。这也是真的吗?

1 个答案:

答案 0 :(得分:3)

例如,对于blacklist.txt

#!/bin/bash
while read line; do
list=/files/*$line*
for file in ${list[@]}
do
[[ -f $file ]] && rm $file
done
done < blacklist.txt

uint8

package main

import "fmt"

func iter(min, max uint8) {
    {
        min, max := uint(min), uint(max)
        for i := min; i <= max; i++ {
            fmt.Printf("%d, ", i)
        }
    }
}

func main() {
    iter(0, 255)
}

输出:

uint64

<强>附录

这是我的Dave C suggestion版本。

package main

import "fmt"

func iter(min, max uint64) {
    for i := min; i <= max; i++ {
        fmt.Printf("%d, ", i)
        if i == max {
            break
        }
    }
}

func main() {
    iter(^uint64(0)-2, ^uint64(0))
}

输出:

18446744073709551613, 18446744073709551614, 18446744073709551615