对于切片长度的返回值,Go和Rust分别选择带符号整形 int 和无符号整形 usize:
- 它们各自是出于怎样的考虑?
- 两种方案它们各自有什么优劣?
- 作为开发者,各位更倾向于那种方案?
Go
len(v Type) int
Rust
pub const fn len(&self) -> usize
对于切片长度的返回值,Go和Rust分别选择带符号整形 int 和无符号整形 usize:
Go
len(v Type) int
Rust
pub const fn len(&self) -> usize
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.3k 阅读
2 回答918 阅读✓ 已解决
2 回答2.2k 阅读
1 回答2.2k 阅读
usize
是u32
/u64
的别名,具体是哪个视平台而定。就是无符号版的i32
/i64
,理论上范围会大二倍(因为没有负数了嘛)。其实就是秉承着“数组长度不可能是负数”这一个理念的。
用无符号确实更符合“逻辑”:反正索引啊、长度啊这些最小只能是 0,用无符号不但能防止不小心赋值成负数导致溢出、还能把数组的最大长度扩充成二倍,岂不美滋滋?
但有符号数也不是一无是处。一来可以减轻心智负担,不用时时刻刻去考虑当前运算的这个数到底是有符号还是无符号的(比如某些语言没有隐式转换,可能会要求你频繁地显式强转)?二来某些语言可能压根就没有单独的无符号数类型(比如 JS、VB),为了后面跨语言调用时方便、所以在语言设计之初就故意使用有符号数。
所以最后还看每个语言的作者的取舍了,没有哪种做法是完美的,一般你用什么语言、跟着这个语言自己的规范走就可以。