GO语言:slice切片
注意:在go语言中,切片属于引用类型,数组属于数值类型
var arr = [3]int{
1, 2, 3}
var slice = []int{
1, 2, 3}
temp1 := arr
fmt.Printf("arr:%p temp1:%p\n", &arr, &temp1)
temp2 := slice
fmt.Printf("slice:%p temp2:%p\n", slice, temp2)
arr:0xc00000a3e0 temp1:0xc00000a420
slice:0xc00000a400 temp2:0xc00000a400
可以看到arr与temp1地址不同,而slice与temp2地址相同
试图更改temp1,temp2中的数据
temp1[0] = 100
temp2[0] = 100
fmt.Printf("arr:%v temp1:%v\n", arr, temp1)
fmt.Printf("slice:%v temp2:%v\n", slice, temp2)
arr:[1 2 3] temp1:[100 2 3]
slice:[100 2 3] temp2:[100 2 3]
数组arr中的元素值并没有改变,而切片slice中的元素值发生了变化,更加证明:
在go语言中,数组是数值类型,切片是引用类型
如何得到切片
1.直接定义
// 切片的定义
// 数组是数值类型,切片是引用类型
var s1 []int // 定义一个存放int类型元素的切片
var s2 []string
fmt.Println(s1, s2)
// 初始化
// 底层都是创建数组,封装成切片返回的,所以长度和容量相等
s1 = []int{
1, 2, 3}
s2 = []string{
"北京", "上海", "深圳"}
定义切片后,未初始化时切片指针指向为nil
该种方式其实是在底层创建了数组,进行切片封装后返回的,所以切片的长度和容量相等
2.由数组得到切片
// 由数组得到切片
a1 := [...]int{
1, 3, 5, 7, 9, 11, 13}
// 左闭右开
s3 := a1[0:4