符号[:]在Go中意味着什么?

时间:2017-12-08 21:38:13

标签: go

我在一些代码中找到了这个:

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

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

1 个答案:

答案 0 :(得分:3)

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

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

另请参阅The Go Programming Language Specification的Slice Expressions部分。

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

a := [3]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}

据推测,这种区别的原因在于额外的类型安全措施。也就是说,length是数组类型的正式部分(例如[4]int是一个包含四个int的数组,不同的大小是不同的类型)而slice可以具有任意长度,包括零。因此,如果您想要已知长度序列的安全性,则使用数组,否则使用Slice以方便使用。