Go 为什么binary.Size()返回(-1)?
代码段如下所示:Go 为什么binary.Size()返回(-1)?,go,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
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)?tl;博士
int
不是固定长度的类型,因此不起作用。使用固定长度的东西,例如int32
解释
这可能看起来像一个bug,但实际上不是bug。报告说:
Size返回Write将生成多少字节来编码值v,该值必须是a固定大小值或固定大小值的切片,或指向此类数据的指针 固定大小值是不依赖于体系结构且大小已知的值 事先。这是
int32
或int64
的情况,但不适用于int
,因为这取决于
环境的架构。看
如果你问自己为什么<代码> siz()<代码>强制执行,请考虑在代码中编码<代码> int >代码>
64位机器,并在远程32位机器上解码数据。这仅在具有长度编码类型时才可能,而int
不是长度编码类型。因此,您要么将大小与类型一起存储,要么强制执行开发人员所做的固定长度类型
这反映在计算大小的编码/二进制
函数中:
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