所以我正在尝试针对所有可能的字节 测试函数,即0
到255
的可能性。如何遍历所有可能的字节?我有
我试过了
for i := 0; i < 256; i++ {
fmt.Println(byte(i)) // prints a number 0-255
fmt.Println(byte{i}) // crashes
}
最佳答案
循环 uint8(又名“字节”)值的一个棘手部分是将 1 加到 255 会使您回到零。如果您的 for 循环条件是 i <= 255
,很容易意外形成无限循环。 .如果目标是遍历每个可能的字节 [0-255],而不引入更大类型的索引器,您可以做到,但必须小心。
go 中的 for 循环具有三个可选部分。它是手动指定初始化、中断条件和增量/减量的模板或简写。 (我松散地使用这些名称 b/c 你可以执行任何你想要的语句/表达式,或者根本不执行)
我将编写一些永远循环的损坏代码,然后以更明确的方式重写它:
原始损坏:
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。在这种情况下,我认为了解它如何与显式跳转/转到一起工作可能有一些指导值(value):
i := byte(0)
printI:
fmt.Println(i)
if i < 255 {
i++
goto printI
}
关于go - 遍历所有可能的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41031438/