【问题标题】:What is the significance of square brackets in denoting the copy destination array?方括号在表示复制目标数组时有什么意义?
【发布时间】:2021-09-04 08:20:33
【问题描述】:

我已经熟悉如何在 Go 中对数组/切片进行切片和切块(实际任务是检查字节切片中的前 N ​​个字节是否是一组特定字节)。

所以我学会了如何将切片中的字节复制到数组中:

var dstArray [1]byte
srcSlice := []byte{0x00}
copy(dstArray[:], srcSlice)

让我感到困惑的是,在copy 调用中,必须在dstArray 的末尾写上[:]。如果我忽略了这个错误:

first argument to copy should be slice; have [1]byte

首先,为什么说“应该切片”?我提供了一个数组,它工作得很好(使用[:] 位)。

而且,主要问题是:为什么它需要[:] 位?在这种情况下,它的意义是什么?如果我们省略它,指令会被误解吗?为什么要把语法复杂化?

【问题讨论】:

  • "数组工作得很好(使用 [:] 位)` - 使数组成为切片的是“[:] 位”。这回答了您的两个问题。
  • @SergioTulentsev 那为什么它说“应该”而不是“必须”?喜欢它更喜欢它是一个切片,但也可以带一个数组或其他东西?
  • 写错误信息的人选择了错误的词。

标签: arrays go slice


【解决方案1】:

[:]是切片表达式的简写。

根据规范:

为方便起见,可以省略任何索引。缺失的低点 索引默认为零;缺少的高索引默认为 切片操作数:

a[2:]  // same as a[2 : len(a)]
a[:3] // same as a[0 : 3]
a[:]  // same as a[0 : len(a)]

另请参阅:https://golang.org/ref/spec#Slice_expressions

【讨论】:

    【解决方案2】:

    首先,为什么说“应该切片”?

    因为函数的API是这样定义的,所以go是强类型语言,所以你应该提供一个所需类型的值。

    我提供了一个数组,它可以正常工作(使用 [:] 位)。

    您不提供数组,而是获取数组并使用 [:] https://play.golang.org/p/TEih17eVWml 将其转换为切片

    为什么需要 [:] 位?

    这是您从 Array 获取切片以符合 Copy API 的方式

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多