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;博士

int不是固定长度的类型,所以它不起作用。使用具有固定长度的东西,例如int32.

解释

这可能看起来像一个错误,但它实际上不是一个错误。的文档Size()说:

Size 返回 Write 将生成多少字节来对值 v 进行编码,该值必须是固定大小的值或固定
大小值的切片,或指向此类数据的指针。

固定大小的值是不依赖于架构的值,并且大小是预先知道的。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 回答