读取的字节数和无符号数

Pin*_*juh 4 io unsigned range go

作为澄清我的问题的一个例子,在Google Go 1.0中,"io"包中定义了以下界面:

type Reader interface {
    Read(p []byte) (n int, err error)
}
Run Code Online (Sandbox Code Playgroud)

特别是结果参数列表(n int, err error)引起了我的兴趣.根据接口文档,本质上字节数不能为负数:

它返回读取的字节数(0 <= n <= len(p))[...]

在C中,使用的原因是用于表示错误条件int的带内值-1(请参阅有效转到:多个返回值).由于具有多个返回值,因此不需要特殊的带内值.

Go 1.0中存在类型uint.

在不使用特殊带内值的情况下,使用int相对于uint仅使用正范围[0,∞)的值的具体原因是什么?

Jes*_*sta 5

整数的事实数字类型是int.这部分是因为signed int以更明显的方式溢出.uint的一个小溢出最终看起来像一个有效的值,但是在一个期望正整数的地方,一个有符号整数的小溢出将是负的和恐慌,例如.切片.

这很重要,因为你通常将Read()和'p'切换为'n'到该长度.

例如.

n, err := a.Read(p)
p = p[:n]
processReadData(p)
Run Code Online (Sandbox Code Playgroud)