Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 为什么binary.Size()返回(-1)?_Go - Fatal编程技术网

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