如何完美地克隆一个切片
以下文章来源于Go 101 ,作者老貘
Go官方维基上列出了两种复制克隆切片的方法。第一种是:
b = make([]T, len(a))
copy(b, a)
第二种是:
b = append([]T(nil), a...)
但是这两种方法都不完美。
- 对于第一种方法来说,如果源切片a为一个nil切片,则结果切片b却不是一个nil切片,而是一个长度为0的空切片。
- 对于第二种方法来说,如果源切片a为一个长度为0的空切片,则结果切片b却是一个nil切片。
下面这段代码实现了完美克隆,但是它太冗长了。
if a == nil {
b = nil
} else {
b = make([]T, len(a))
copy(b, a)
}
有没有一种即简洁又完美的切片克隆方法呢?据我所知,下面这行实现比官方维基上的两种方法要完美(而且保持了简洁性)。
b = append(a[:0:0], a...)
此实现保证了:
- 如果源切片a为一个nil切片,则结果切片b也是一个nil切片。
- 如果源切片a为一个长度为0的空切片,则结果切片b也是一个长度为0的空切片。
此完美实现基于从一个nil切片派生出来的切片仍为一个nil切片这一事实。