英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论