GO-数组与切片
程序员文章站
2023-01-21 23:52:55
一.数组的定义 二.切片的定义 三.关于数组与切片之间的转换以及原理 转换 补充 长度:len() 容量:cap() 原理 数组变成索引其实切片就相当于创建了一个索引指向数组 四.关于切片与数组之间发生变化 情况一:当切片和数组未发生数据增加 切片或者数组里值发生变化,其对应数组或者切片均会受到影响 ......
一.数组的定义
//var 变量名 [数组的容量]类型 = [数组的容量]类型{值1,值2} var a [4]int = [4]int{1,2,3} 或者 var a = [4]int{1,2,3} 或者 a := [4]int{1,2,3} //这几个的结果为[1 2 3 0] //接受长度有赋值的长度决定 package main import "fmt" func main(){ var a = [...]int{1,2,3} //a :=[...]int{1,2,3} //但是无法使用var a [...]int = [...]int{1,2,3} //只能var a [3]int = [...]int{1,2,3} fmt.println(a) } //结果为[1 2 3]
二.切片的定义
var a []int = []int{1,2,3} 或者 var a = []int{1,2,3} 或者 a := []int{1,2,3}
三.关于数组与切片之间的转换以及原理
转换
//如果有数组a := [4]int{1,2,3,4} //我们要取第二个 b :=a[1] //取第二个和第三个 b :=a[1,3] //取第二个到最后一个 b :=a[1:] //此时切片的b的长度由切区数组的个数决定 //此时切片的b的容量由切区数组从切的位置到数组末尾位置
补充
- 长度:len()
- 容量:cap()
原理
数组变成索引其实切片就相当于创建了一个索引指向数组
四.关于切片与数组之间发生变化
情况一:当切片和数组未发生数据增加
切片或者数组里值发生变化,其对应数组或者切片均会受到影响
情况二:当切片发生数据增加(未超过容量)
比如
package main import "fmt" func main(){ a := [3]int{1,2,3} var b = a[1:2] b= append(b,33) fmt.println(a,b) } //打印结果[1 2 33] [2 33] //两个会相互受影响
情况三:当切片发生数据增加(超过容量)
package main import "fmt" func main(){ a := [3]int{1,2,3} var b = a[1:2] b= append(b,33,3) fmt.println(a,b) } //打印结果[1 2 3] [2 33 3] //两个不会受影响 //其实他底层发生了这样一件事件 //如果超过定长,底层会重新复制切片那一段数据且容量为原先的两倍 //而此时切片b的所有指向的位置也发送改变改变为新开辟出来的那段数据