专栏首页Go语言101在Go编程中如何完美地克隆一个切片

在Go编程中如何完美地克隆一个切片

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切片这一事实。


更多关于Go语言的细节、技巧和常识,请访问《Go语言101》项目或者《Go语言101》官网,或者关注本专栏公众号(Go 101):

Go 101.jpg

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go标准编译器对字符串和字节切片之间的转换操作所做的一些优化

    Go标准编译器在某些情形下,对这两种转换进行了优化,从而避免了复制字符串或者字节切片的字节序列。下面将列出这些情形。

    刘老貘
  • Go编程中很多场合下使用append来克隆切片常常比使用copy高效得多

    从这个结果可以看出,使用append来克隆切片比使用make+copy要高效得多。使用make+copy相对低效的原因是make需要将其开辟出的每个元素置零,这...

    刘老貘
  • Go标准编译器所做的一些优化

    本博的另两篇文章中已经介绍了Go标准编译器对字符串和字节切片之间相互转换所做的一些优化和边界消除优化。下面将介绍Go标准编译器(截至Go SDK 1.12.x)...

    刘老貘
  • 一文读懂网络切片

    在各种新兴业务不断涌现的今天,现有的4G LTE网络已经无法满足日益增多的业务需求,因此未来的网络需要通过网络切片技术从“one size fits all”向...

    SDNLAB
  • Golang语言--切片之append() 和 copy() 函数

    Slice允许增加使用切片的append()函数。使用copy()函数,源切片的内容复制到目标切片。下面是一个例子: ? 当上述代码被编译和执行时,它产生了以...

    李海彬
  • 端到端网络切片如何解决行业挑战并支持新业务模式

    SDNLAB
  • 浅谈5G网络切片的商业应用

    可定制:网络的逻辑功能、关键SLA指标可定制,包括带宽、时延、丢包和抖动等传统网络指标,可以满足差异化的业务要求。

    灯塔大数据
  • GIS讲堂第二课-地图切片简介以及OL中的调用

    在大家的支持与帮助下,“GIS讲堂”第二课已落下帷幕,在此对大家的支持与帮助表示衷心的感谢,同时呢,也给大家致歉,由于感冒的缘故,讲课的时候的各种毛病还请大家多...

    lzugis
  • Python中14个切片操作,你常用哪几个?

    切片(Slice)是一个取部分元素的操作,是Python中特有的功能。它可以操作list、tuple、字符串。

    double
  • 手把手golang基础教程——数组与切片

    今天是golang专题的第五篇,这一篇我们将会了解golang中的数组和切片的使用。

    TechFlow-承志

扫码关注云+社区

领取腾讯云代金券