我在crypto/sha256/sha256.go
中找到了以下代码:
func putUint32(x []byte, s uint32) {
_ = x[3]
x[0] = byte(s >> 24)
x[1] = byte(s >> 16)
x[2] = byte(s >> 8)
x[3] = byte(s)
}
所有我看到的是,如果len(x)
不小于4,则对空白标识符的分配会感到恐慌,这甚至不如{ {1}}。因此,下面的代码(更短,更理想的代码)不等效吗?
x[3]
如果是这样,为什么它不是这样写的?
答案 0 :(得分:6)
_ =
分配本身不执行任何操作,但是分配给它的索引表达式可以在许多其他低级索引操作之前访问片中所需的最后一个元素。这是一种优化方法,向编译器暗示该值上的所有较低索引操作都是安全的,并且可以取消边界检查。这通常被称为“消除边界检查”
不使用后一个示例的主要原因是第二个优化,需要按顺序读取字节,以便编译器可以将它们合并为多字节负载。