定制软件开发Golang Append()详解

append定制软件开发函数的使用:

append定制软件开发可以向一个中定制软件开发追加一个元素、多个元素、新的切片

var x []intx = append(x, 1) // 追加一个元素x = append(x,2,3,4) //定制软件开发追加多个元素x = append(x, []int{5,6,7}...) //追加一个新的切片
  • 1
  • 2
  • 3
  • 4
  • 5

追加一个切片需要进行解包

append()的原理

  1. 如果原来slice capacity足够大的情况下,append()函数会创建一个新的slice,它与old slice共享底层内存

    创建原理:newSlice = oldSlice[:1+len(x)]

    用old slice给new slice进行赋值的方式进行创建,会共享内存。并返回这个new slice。

    因此为了保险,我们通常将append返回的内容赋值给原来的slice: x = appen(x,…)

  2. 如果原来的slice没有足够的容量添加内容,则创建一个新的slice,这个slice是copy的old slice。不与old slice共享内存

实例:appendInt()

这个是只能追加一个元素的例子

追加之前,判断cap(x) 是否足够,

  • 如果足够则创建的z 大小是 len(x) + 1
  • 如果不够,则创建一个是原来两倍大的z
func appendInt(x []int, y int) []int {	var z []int        // 创建一个中间数组	zlen := len(x) + 1 // 准备增加一个元素的位子	// 判断 x 的cap是否足够容纳新的元素	if zlen <= cap(x) {		// 容量足够,直接将x拷贝给y		z = x[:zlen]		//如果容量足够要装一个z,比x大一个位子,因此要把x后面的空位也拷贝过去	} else {		// x 的容量不够 需要扩容		zcap := zlen // 如果xlen == 0		if zcap < 2*len(x) {			zcap = 2 * len(x) //创建为原来的两倍		}		z = make([]int, zlen, zcap)		copy(z, x)	}	z[len(x)] = y // 将y放在最后一个位子	return z}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

测试:

func main() {	var x, y []int	for i := 0; i < 10; i++ {		y = appendInt(x, i)		fmt.Printf("%d cap=%d\t%v\", i, cap(y), y)		x = y	}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

每次容量的变化:

0  cap=1    [0]1  cap=2    [0 1]2  cap=4    [0 1 2]3  cap=4    [0 1 2 3]4  cap=8    [0 1 2 3 4]5  cap=8    [0 1 2 3 4 5]6  cap=8    [0 1 2 3 4 5 6]7  cap=8    [0 1 2 3 4 5 6 7]8  cap=16   [0 1 2 3 4 5 6 7 8]9  cap=16   [0 1 2 3 4 5 6 7 8 9]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

拷贝:赋值 copy区别

= 赋值拷贝,会将原来slice的地址拷贝,新旧slice共享内存。

copy(new, old) 函数copy只会将slice内容进行拷贝。

	var x, y []int	x = []int{1, 2, 3, 4}	fmt.Println(x, y) // [1 2 3 4] []	y = x	y[0] = 0	fmt.Println("y 改后 : ", x, y) //[0 2 3 4] [0 2 3 4]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发