【问题标题】:why cannot I assign a newly allocated byte array to a variable with []byte as type?为什么我不能将新分配的字节数组分配给以 []byte 为类型的变量?
【发布时间】:2014-06-28 01:12:10
【问题描述】:
我正在尝试声明一个具有未指定大小[]byte 的数组类型变量,然后用分配的大小为256 的数组填充它,如下所示:
var buf []byte
buf = new([256]byte)
不幸的是,它不起作用。返回的编译错误如下:
cannot use *new([256]byte) (type [256]byte) as type []byte in assignment
有什么想法吗?
【问题讨论】:
标签:
arrays
memory-management
types
go
allocation
【解决方案1】:
您也可以像这样将新分配的数组用作切片:
var slice []byte = buf[:]
这会将切片创建为由数组 buf 支持的切片。
【解决方案2】:
您想将一个数组分配给一个切片,这是行不通的(请参阅“Go Slices: usage and internals”)
要改为切片,请使用:
var buf []byte
buf = make([]byte, 256)
区别:
数组变量表示整个数组;它不是指向第一个数组元素的指针(在 C 中就是这种情况)。
这意味着当您分配或传递数组值时,您将复制其内容。 (为了避免复制,您可以传递一个指向数组的指针,但那是指向数组的指针,而不是数组。)
考虑数组的一种方法是将其视为一种结构,但具有索引而不是命名字段:固定大小的复合值。
对比:
切片是数组段的描述符。
它由指向数组的指针、段的长度及其容量(段的最大长度)组成。
如果你想创建一个数组(将它分配给一个数组),那就是:
var buf [256]byte
buf = [256]byte{}