4

私の質問を明確にする例として、Google Go 1.0では、次のインターフェースが「io」パッケージで定義されています。

type Reader interface {
    Read(p []byte) (n int, err error)
}

特に結果パラメータリスト(n int, err error)は私に興味をそそられます。インターフェイスのドキュメントによると、本質的にバイト数を負にすることはできません。

読み取られたバイト数を返します(0 <= n <= len(p))[...]

Cで使用する理由は、エラー状態を通知するためintの帯域内値でした( Effective Go:複数の戻り値を参照)。複数の戻り値があるため、特別な帯域内値は必要ありません。-1

Go1.0にはタイプuintがあります。

特別な帯域内値を必要とせずに正の範囲[0、∞)のみを使用する値の場合とint比較して、使用する具体的な理由は何ですか?uint

4

2 に答える 2

5

整数の事実上の数値型はintです。これは、signedintがより明白な方法でオーバーフローするためです。uintの小さなオーバーフローは、最終的には有効な値のように見えますが、signed intの小さなオーバーフローは負になり、正の整数を期待する場所ではパニックになります。スライス。

通常、Read()から「n」を取得し、「p」をその長さにスライスするため、これは重要です。

例えば。

n, err := a.Read(p)
p = p[:n]
processReadData(p)
于 2012-06-05T00:56:43.513 に答える
1

ほとんどの場合、整数の事実上の数値型はですint。たとえば、値を負にすることはできませんが、値len(x)cap(x)返します。intほとんどの場合、intを返すと、異なる数値型間の型変換を回避するのに役立ちます。

そうです、Read()を返すこともできますがuint、これにより、作業が少し扱いに​​くくなります。

于 2012-06-04T23:59:28.587 に答える