我在一些代码中找到了这个:
h := s.Hash(tx)
sig, err := crypto.Sign(h[:], prv)
[:]
是什么意思?
如果这是数组的完整切片,为什么不传递数组呢?我想知道这是什么样的编码风格......
答案 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以方便使用。