golang slice分割和append copy还是引用

1.

slice1:= slice[0:2]

引用,非复制,所以任何对slice1或slice的修改都会影响对方

data := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
data1 := data[0:2]
data1[0] = 99
fmt.Println(data1)
fmt.Println(data)

[99 2]

[99 2 3 4 5 6 7 8 9 0]


2.append

append 比较特殊

声明:

源slice= src

添加slice = app

结果slice=tar

1)如果len(src) + len(app) <= cap(src)  src和tar 是指向同一数据引用 ,即修改src或tar,会影响对方

2)否则 tar 是copy的方式 src + app ,即修改src或tar,不会影响对方

无论哪种情况不会影响app,因为app都会用copy的方式进入tar

func test2() {
	data := make([]int, 10, 20)
	data[0] = 1
	data[1] = 2
	dataappend := make([]int, 10, 20)//len <=10 则 	result[0] = 99 会 影响源Slice
	dataappend[0] = 1
	dataappend[1] = 2
	result := append(data, dataappend...)
	result[0] = 99
	result[11] = 98
	fmt.Println("length:", len(data), ":", data)
	fmt.Println("length:", len(result), ":", result)
	fmt.Println("length:", len(dataappend), ":", dataappend)
}




本文来自:开源中国博客

感谢作者:咖啡伴侣

查看原文:golang slice分割和append copy还是引用

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。