英文:
What is the significance of square brackets in denoting the copy destination array?
问题
我一直在熟悉如何在Go语言中切片和切割数组/切片(实际任务是检查字节切片中的前N个字节是否是一组特定的字节)。
所以我学会了如何将切片中的字节复制到数组中:
var dstArray [1]byte
srcSlice := []byte{0x00}
copy(dstArray[:], srcSlice)
然而,让我困惑的是在copy
调用中为什么需要在dstArray
的末尾写上[:]
。如果我省略它,就会出现以下错误:
copy的第一个参数应该是切片;现在是[1]byte
首先,为什么它说"应该是切片"?我提供的是一个数组,而且它完全正常工作(带有[:]
部分)。
而且,主要问题是:为什么它需要[:]
这部分?在这个上下文中它的意义是什么?如果我们省略它,指令会被误解吗?为什么要复杂化语法?
英文:
I have been getting familiar with how to slice and dice arrays/slices in Go (the actual task is to check if the first N bytes in a byte slice is a set of particular bytes).
So I have learnt how to copy bytes from a slice into an array:
var dstArray [1]byte
srcSlice := []byte{0x00}
copy(dstArray[:], srcSlice)
What puzzles my though is the necessity to write [:]
at the end of dstArray
in the copy
call. If I omit that I get this error:
first argument to copy should be slice; have [1]byte
First of all, why does it say "should be slice"? I provide an array instead and it works just fine (with the [:]
bit).
And, the main question is: why does it require the [:]
bit? What is the significance of it in this context? Could the instruction be somehow misinterpreted if we omit it? Why complicate the syntax?
答案1
得分: 3
[:]
是切片表达式的简写形式。
根据规范:
> 为了方便起见,任何索引都可以省略。缺少的低索引默认为零;缺少的高索引默认为切片操作数的长度:
>
>
> a[2:] // 等同于 a[2 : len(a)]
> a[:3] // 等同于 a[0 : 3]
> a[:] // 等同于 a[0 : len(a)]
参考链接:https://golang.org/ref/spec#Slice_expressions
英文:
[:]
is the shorthand of slice expression.
According to the spec:
> For convenience, any of the indices may be omitted. A missing low
> index defaults to zero; a missing high index defaults to the length of
> the sliced operand:
>
>
> a[2:] // same as a[2 : len(a)]
> a[:3] // same as a[0 : 3]
> a[:] // same as a[0 : len(a)]
答案2
得分: 2
首先,为什么会说“应该是切片”?
因为这是函数的 API 定义方式,Go 是一种强类型语言,所以你应该提供所需类型的值。
我提供了一个数组,而不是切片,并且它可以正常工作(使用了 [:] 部分)。
你并没有提供一个数组,而是通过使用 [:] 将其转换为切片。这是一个示例:https://play.golang.org/p/TEih17eVWml
为什么需要 [:] 部分?
这是将数组转换为切片以符合 Copy API 的方法。
英文:
> First of all, why does it say "should be slice"?
Because this is how the API of the function is defined, go is strongly typed language, so you should provide a value of the required type.
> I provide an array instead and it works just fine (with the [:] bit).
You don't provide an array, you take an array and convert it to slice by using [:] https://play.golang.org/p/TEih17eVWml
> why does it require the [:] bit?
This is how you get a slice from Array to conform with the Copy API
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论