go - 遍历所有可能的字节

标签 go byte

所以我正在尝试针对所有可能的字节 测试函数,即0255 的可能性。如何遍历所有可能的字节?我有

我试过了

 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/

相关文章:

http - 我应该在 golang 中直接使用 ServeMux 还是 http

Golang 用主包代码和.a 文件编译?

python - 如何在 python 中通过套接字发送字节?

c 获取整数的第n个字节

java - 在Java中通过TCP传输文件时,即使我指定的字节大小大于图像,它也不会传输整个图像

go - 使用存储在 Golang 自己的数据库中的用户创建 Google 身份验证服务

html - Golang 保存到 json 文件

go - 在 Golang 中将 int 数组转换为字节数组

php - Windows Phone中上传图片和php POST方法

java - 将 int 转换为十六进制字节值