在Go语言中,切片(slice)和数组(array)是一种引用和被引用的关系,切片是对数组的引用,是从数组中生成而来的,如果对切片进行修改或者添加元素的操作,它引用的数组内对应的元素值也会被修改或者覆盖。当切片是从其他数组或者其他的切片生成时,新切片的元素添加或者覆盖,会对原来引用的数组或者切片内的元素产生影响,原来数组或切片内元素的值同样会跟着一起改变。这样看,切片也有点像是“指针”。
下面通过一个具体的例子来反应这种关系:
package main
import "fmt"
//因为切片是对数组的引用,对切片进行添加元素时,会覆盖相应的数组中对应的元素
func main(){
var emp = [...]string{"Jack","Damon","Terry"}
var emp1 = emp[0:1] //从emp数组生成切片emp1,引用其中的第一个元素
fmt.Println("emp数组:",emp)
fmt.Println("emp1切片:",emp1)
emp1 = append(emp1,"Steven") //对emp1切片进行元素的添加,会覆盖调引用数组emp中的第二个元素
fmt.Println("扩充后的emp1切片:", emp1, "切片长度:", len(emp1), "切片容量:", cap(emp1))
fmt.Println("扩充切片emp1以后的数组emp的元素值变为:",emp)
}
运行后输出的结果:
emp数组: [Jack Damon Terry]
emp1切片: [Jack]
扩充后的emp1切片: [Jack Steven] 切片长度: 2 切片容量: 3
扩充切片emp1以后的数组emp的元素值变为: [Jack Steven Terry]
可以看到,对切片emp1进行扩充以后,其引用的数组emp内相应位置的元素也发生了变化。
版权声明:除特殊说明,文章均为博主 去吐槽 原创文章,转载请注明原文出处。