迭代所有可能的字节

时间:2016-12-08 03:47:22

标签: go byte

所以我试图针对每个可能的字节测试一个函数,即document.getElementById("test").innerHTML0种可能性。如何迭代所有可能的字节?我已经

我试过

255

4 个答案:

答案 0 :(得分:1)

关于循环遍历uint8(又称“字节”)值的棘手部分是,将1加到255会使您回到零。如果您的for循环条件为i <= 255,很容易意外地形成无限循环。如果目标是遍历每个可能的字节[0-255],而不引入较大类型的索引器,则可以这样做,但必须小心。

go中的for循环具有三个可选部分。它是手动指定初始化,中断条件和增量/减量的模板或简写。 (我宽松地使用了这些名称,因为您可以执行所需的任何类型的语句/表达式,或者根本不执行任何语句)

我要写一些永远循环的坏代码,然后以更明确的方式重写它:

原始破损:

for i := byte(0); i <= 255; i++ {
    fmt.Println(i)
}

类似于此明确的损坏版本:

i := byte(0)

for ; ;  {
    if i <= 255{
        fmt.Println(i)
        i++
    } else { 
        break
    }
}

看第二个例子,我们可以更容易地看到问题。我们想在i==255时跳出循环,但要在运行fmt.Println(i)之后才跳出循环-而且我们肯定不要i == 255时要递增。关于for循环检查条件和增量的顺序没有什么神圣的-如果默认顺序不适合我们的情况,则以有效的顺序显式重写代码。在我们的案例中,我们最关心何时突破循环:

正常运行的示例:

i := byte(0)

for ; ; {
    fmt.Println(i)
    if i == 255{
        break
    } else { 
        i++
    }
}

更简洁的示例:

for i := byte(0); ;i++ {
    fmt.Println(i)
    if i == 255{
        break
    }
}

虽然我们在这里,但我要指出,for循环是围绕条件跳转语句的抽象,或者换句话说,就是gotos。在这种情况下,我认为在使用显式跳转/跳转时如何工作将具有一定的指导意义:

i := byte(0)

printI:
fmt.Println(i)

if i < 255 {
    i++
    goto printI
}

答案 1 :(得分:0)

如果你需要确保“i”变量是一个字节(即uint8),那么你可以这样做:

for i := byte(0); i < 255; i++ {
    fmt.Println(i)
}

答案 2 :(得分:0)

或者,如果您想保留传统的for循环语法以提高可读性-

for i := 0; i < 256; i++ {
    fmt.Println(byte(i))
}

去游乐场:https://play.golang.org/p/jjjg9YgXSjc

答案 3 :(得分:-1)

对我而言,fmt.Println(byte(i))似乎正在发挥作用。你期待什么输出?