为什么binary.Size()返回(-1)?

时间:2013-10-25 01:50:28

标签: go

代码段喜欢这样:

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)?

1 个答案:

答案 0 :(得分:3)

TL;博士

int不是固定长度类型,因此无法正常工作。使用具有固定长度的内容,例如int32

解释

这可能看起来像一个bug,但它实际上不是一个bug。 documentation of Size()说:

  

Size返回Write将生成的用于编码值v的字节数,该值必须为
  固定大小的值或固定大小值的切片,或指向此类数据的指针。

固定大小的值是一个不依赖于体系结构且已知大小的值 预先。 int32int64就是这种情况,但int却不是这样,因为它依赖于Size() 环境的架构。请参阅documentation of int

如果您问自己为什么int强制执行此操作,请考虑在您的int上编码encoding/binary 64位机器并在远程32位机器上解码数据。仅当您具有长度编码类型(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 {{1}}函数中:

{{1}}

如您所见,列出了所有数字类型,但{{1}}。