如何完美地克隆一个切片

以下文章来源于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切片这一事实。

10