Go和Rust中分别使用 int 和 usize 类型表示切片长度,使用带符号整形和无符号整形两种方案各有什么优劣?

对于切片长度的返回值,Go和Rust分别选择带符号整形 int 和无符号整形 usize:

  1. 它们各自是出于怎样的考虑?
  2. 两种方案它们各自有什么优劣?
  3. 作为开发者,各位更倾向于那种方案?

Go

len(v Type) int

Rust

pub const fn len(&self) -> usize
阅读 2.2k
1 个回答

usizeu32 / u64 的别名,具体是哪个视平台而定。就是无符号版的 i32 / i64,理论上范围会大二倍(因为没有负数了嘛)。

其实就是秉承着“数组长度不可能是负数”这一个理念的。

用无符号确实更符合“逻辑”:反正索引啊、长度啊这些最小只能是 0,用无符号不但能防止不小心赋值成负数导致溢出、还能把数组的最大长度扩充成二倍,岂不美滋滋?

但有符号数也不是一无是处。一来可以减轻心智负担,不用时时刻刻去考虑当前运算的这个数到底是有符号还是无符号的(比如某些语言没有隐式转换,可能会要求你频繁地显式强转)?二来某些语言可能压根就没有单独的无符号数类型(比如 JS、VB),为了后面跨语言调用时方便、所以在语言设计之初就故意使用有符号数。

所以最后还看每个语言的作者的取舍了,没有哪种做法是完美的,一般你用什么语言、跟着这个语言自己的规范走就可以。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题