3

コード スニペットは次のようになります。

package main
import (
    "fmt"
    "encoding/binary"
    "reflect"
)

const (
    commandLen = 1
    bufLen int = 4
)

func main(){
    fmt.Printf("%v %v\n", reflect.TypeOf(commandLen), reflect.TypeOf(bufLen))
    fmt.Printf("%d %d", binary.Size(commandLen), binary.Size(bufLen))
}

出力は次のとおりです。

int int
-1 -1

commandLen と bufLen の型は int であり、「golang でのプログラミング」から、int は実装に応じて int32 または int64 である必要があるため、binary.Size() は (- 1)。

binary.Size() が (-1) を返すのはなぜですか?

4

1 に答える 1

3

tl;dr

intは固定長型ではないため、動作しません。など、固定長のものを使用しますint32

説明

これはバグのように見えるかもしれませんが、実際にはバグではありません。のドキュメントにSize()は次のように書かれています。

Size は、値 v をエンコードするために Write が生成するバイト数を返します。これは、固定サイズの値、固定サイズの値のスライス、またはそのようなデータへのポインターでなければなりませ
ん。

固定サイズの値は、アーキテクチャに依存しない値であり、サイズは事前にわかっています。これは、環境のアーキテクチャに依存するため、int32またはそうではint64ありません。のドキュメントをint参照してください。int

Size()がこれを強制する理由を自問している場合はint、64 ビット マシンで をエンコードし、リモートの 32 ビット マシンでデータをデコードすることを検討してください。これは、長さがエンコードされた型を持っている場合にのみ可能ですが、そうでintはありません。したがって、サイズをタイプとともに保存するか、開発者が行った固定長タイプを強制する必要があります。

これは、サイズを計算するのsizeof()関数に反映されます。encoding/binary

case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
       reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
       reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128:
       return int(t.Size()), nil

ご覧のとおり、すべての数値型がリストされていますが、reflect.Int.

于 2013-10-25T02:02:39.907 に答える