gpt4 book ai didi

go - 为什么 len() 返回有符号值?

转载 作者:IT老高 更新时间:2023-10-28 13:06:12 27 4
gpt4 key购买 nike

Go 的内置 len() function返回签名的 int .为什么不是 uint改用了吗?

len() 有可能吗?返回负面的东西?
据我所知,答案是否定的:

  • Arrays : "元素的个数叫做长度,永远不会是负数。"
  • Slices : "在任何时候都存在以下关系:0 <= len(s) <= cap(s)"
  • Maps “ map 元素的数量称为它的长度”。 (我在规范中找不到任何明确将其限制为非负值的内容,但我很难理解为什么 map 中的元素可能少于 0 个)
  • Strings “一个字符串值是一个(可能是空的)字节序列......字符串 s 的长度(它的字节大小)可以使用内置函数 len() 来发现”(再次,很难看出一个序列的字节数可能为负数)
  • Channels "在 channel 缓冲区中排队的元素数(同上)

最佳答案

len()(和 cap())返回 int 因为那是用来索引 slice 和数组的(不是 uint)。所以问题更多的是“当没有负索引时,为什么 Go 使用有符号整数来索引 slice/数组?”。

答案很简单:计算索引是很常见的,如果在无符号整数中进行此类计算,很容易下溢。像 i := a-b+7 这样的无辜代码可能会为 ab 6 和 10。这样的索引可能会溢出您的 slice 。许多索引计算发生在 0 附近,使用无符号整数很难正确计算,这些错误隐藏在数学上完全合理和合理的公式后面。这既不安全也不方便。

这是基于经验的权衡:下溢往往发生在使用无符号整数进行的索引计算中,而如果使用有符号整数进行索引计算,上溢则不太常见。

另外:在这些情况下使用无符号整数的好处基本上为零。

关于go - 为什么 len() 返回有符号值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39088945/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com