英文:
Why big.NewInt(0).Bytes() returns [] instead of [0] in Go?
问题
我发现奇怪的是,运行big.NewInt(0).Bytes()返回的是[]而不是[0]。它真的应该这样工作吗?
https://play.golang.org/p/EEaS8sCvhFb
英文:
I find it weird that running big.NewInt(0).Bytes() returns [] instead of [0]. Is it really supposed to work that way?
答案1
得分: 5
big.Int是一个结构体。在可能的情况下,使用零值是符合惯例的。big.Int也不例外:Int类型的零值表示为0。
这是一个实现细节,但是Int的数据存储在一个切片中。切片的零值是nil,也就是没有元素。
所以这非常方便,也非常高效。0可能是最常见的值,而且可能存在一些情况下,初始的big.Int不会被改变,因此不会分配内部表示的切片。
参考链接:https://stackoverflow.com/questions/64257065/is-there-another-way-of-testing-if-a-big-int-is-0/64257532#64257532
英文:
big.Int is a struct. It's idiomatic to make the zero value useful whenever possible. big.Int is no exception: The zero value for an Int represents the value 0.
It's an implementation detail, but the data of the Int is stored in a slice. The zero value for slices is nil, that is: no elements.
So this is very convenient, and very efficient. 0 is probably the most frequent value, and there may be cases where an initial big.Int won't get changed, and so no slice for the internal representation will be allocated.
See related: https://stackoverflow.com/questions/64257065/is-there-another-way-of-testing-if-a-big-int-is-0/64257532#64257532
答案2
得分: 2
从文档中可以得知:
> Bytes函数将x的绝对值作为大端字节切片返回。
该包的API并未定义切片的长度。在这种情况下,它使用了最少的字节数来表示整个数字。
这种情况更有可能是一个实现细节:big.Int在一个切片中保存数字的字节。在Go中,空切片(切片的零值)的长度为0。当创建一个big.Int值时,我们期望它的值也为0。因此,如果一个空切片在内部对应于数值0,就不需要执行额外的检查或填充,这样可以简化实现。
英文:
From the documentation:
> Bytes returns the absolute value of x as a big-endian byte slice.
The package API doesn't define how many bytes long the slice will be. In this case, it's using the smallest number of bytes needed to convey the whole number.
The more likely reason why this happens is an implementation detail: The big.Int maintains the bytes of the number in a slice. nil slices in Go (the zero value of a slice) have length 0. When a big.Int value is initially created, we'd expect it to also have a value of 0. Therefore, it simplifies the implementation if an empty slice internally corresponds to a numerical value of 0, without needing to perform extra checks or padding.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论