英文:
why cannot I assign a newly allocated byte array to a variable with []byte as type?
问题
我正在尝试声明一个未指定大小的[]byte
类型的数组变量,并将其填充为大小为256
的分配数组,代码如下:
var buf []byte
buf = new([256]byte)
不幸的是,它不起作用。返回的编译错误如下:
无法将*new([256]byte)(类型为[256]byte)分配给类型[]byte
有什么想法吗?
英文:
I am trying to declare a variable of type array with unspecified size []byte
and then filling it with an allocated array of size 256
as follows:
var buf []byte
buf = new([256]byte)
Unfortunately, it does not work. The compile error returned is the following:
cannot use *new([256]byte) (type [256]byte) as type []byte in assignment
Any idea?
答案1
得分: 6
你想将一个数组分配给一个切片,这是行不通的(参见《Go切片:用法和内部原理》)。
要创建一个切片,可以使用以下代码:
var buf []byte
buf = make([]byte, 256)
两者的区别是:
- 数组变量表示整个数组;它不是指向第一个数组元素的指针(与C语言中的情况不同)。
这意味着当你赋值或传递一个数组值时,会复制其内容。(为了避免复制,你可以传递一个指向数组的指针,但那就是指向数组的指针,而不是数组本身。)
可以将数组视为一种类似于结构体的东西,但其字段是按索引而不是按名称进行访问的:一个固定大小的复合值。
相比之下:
- 切片是对数组片段的描述。
它由指向数组的指针、片段的长度和其容量(片段的最大长度)组成。
如果你想创建一个数组并将其分配给一个数组,可以使用以下代码:
var buf [256]byte
buf = [256]byte{}
英文:
You want to assign an array to a slice, which won't work (see "Go Slices: usage and internals")
To make a slice instead, use:
var buf []byte
buf = make([]byte, 256)
The difference:
> An array variable denotes the entire array; it is not a pointer to the first array element (as would be the case in C).
This means that when you assign or pass around an array value you will make a copy of its contents. (To avoid the copy you could pass a pointer to the array, but then that's a pointer to an array, not an array.)
One way to think about arrays is as a sort of struct but with indexed rather than named fields: a fixed-size composite value.
Versus:
> A slice is a descriptor of an array segment.
It consists of a pointer to the array, the length of the segment, and its capacity (the maximum length of the segment).
If you want to create an array (an assign it to an array), that would have been:
var buf [256]byte
buf = [256]byte{}
答案2
得分: 2
你还可以通过像这样对其进行切片,将新分配的数组用作切片:
var slice []byte = buf[:]
这将创建一个由数组buf支持的切片slice。
英文:
You can also use the newly allocated array as a slice by slicing it like this:
var slice []byte = buf[:]
This creates slice as a slice that is backed by the array buf.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论