Go语言中数组和切片的关系

在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内相应位置的元素也发生了变化。

%title插图%num

相关文章 推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注