【问题标题】:what does the symbol [:] mean in Go?Go 中的符号 [:] 是什么意思?
【发布时间】:2017-12-08 21:38:12
【问题描述】:

我在一些代码中发现了这一点:

h := s.Hash(tx)
sig, err := crypto.Sign(h[:], prv)

[:] 是什么意思? 如果这是数组的完整切片,为什么不传递数组本身呢?这是什么编码风格,不知道……

【问题讨论】:

  • 它确实需要一个完整数组的切片 (as covered in the Go tour),并且您会将它而不是完整数组传递给一个接受切片而不是数组的函数。它们不可互换。
  • [:] 的原因之一是它允许您通过创建对数组数据的引用(切片)来从数组转换为切片,而无需额外复制。如果您只是将一个数组传递给函数(方法),您将创建一个新的数据副本。

标签: go


【解决方案1】:

在go中,Arrays和Slices略有不同,不能互换使用;但是,您可以使用 [:] 运算符轻松地从数组中创建切片。

本文详细讲解-Go Slices: Usage and Internals

另请参阅 Go 编程语言规范的 Slice Expressions 部分。

简而言之,[:] 运算符允许您从数组创建切片,可选择使用开始和结束边界。例如:

a := [4]int{1, 2, 3, 4} // "a" has type [4]int (array of 4 ints)
x := a[:]   // "x" has type []int (slice of ints) and length 4
y := a[:2]  // "y" has type []int, length 2, values {1, 2}
z := a[2:]  // "z" has type []int, length 2, values {3, 4}
m := a[1:3] // "m" has type []int, length 2, values {2, 3}

这种区别的原因大概是为了增加类型安全性。也就是说,长度是数组类型的正式部分(例如,[4]int 是一个由四个整数组成的数组,不同的大小是不同的类型),而切片可以有任何长度,包括零。因此,如果您想要已知长度序列的安全性,请使用 Array,否则为方便起见使用 Slice。

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 2011-04-18
    • 1970-01-01
    • 2023-03-18
    • 2011-04-07
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多