golang 数组
golang中的数组 python当中称作列表 C也称作列表
注意
a :=[3]int{} 这是数组 不可添加 但可通过下标更改和赋值
a := []int{1,2,3} (s := make([]int, 3) 后面的3 为初始容量)这是切片 可添加 可以通过下表更改值,一开始就要定义切片内容
数组和切片进行切片
list := []int{1, 2, 3, 4, 5, 6}
splice := list[1:3:4] //后面的4代表容量 容量大小不能大于被切片的容量大小 要大于等于len() 小于等于cap()
golang 中数组很明显受到python的影响 可以切片 map 等 包含大量条目(item)
数组是具有相同且唯一类型的一组已编号且长度固定的数据项序列(这是一种同构的数据结构)
-
数组长度必须是一个常量表达式,并且必须是一个非负整数。
-
数组长度也是数组类型的一部分。所以[5]int 和 [10]int是属于不同类型的。
-
数组的编译时值的初始化是按照数组顺序完成的
-
数组元素通过索引(位置)来读取(修改) 索引从0 开始。
-
元素的数目 ,也成为长度或者数组的大小必须是固定的并且在声明该数组时就给出(编译时需要知道数组长度一边分配内存),数组长度最大为2GB。
声明格式:var identifier [len]type
举例:var list1 [3]int
也可以 var array [4]int{1,2,3,4};假如后续大括号中数不及前面所规范的 go会自动补全0
注意 : 若是不限长度 不知道具体长度的数组可用[...] go会自动根据后续的数值设定长度 自动添加,表示 例如 var array [...]int
每个元素都是一个整形值,当声明数组时所有的元素都会自动初始化默认值 0;
数组是可变类型
数组对比: 只有数组元素类型相同,并且两边数组中的每个元素都相等,数组才相等。
指针和数组
指针的实际意义在于减少开销 例如在传参的时候 如果不是指定的指针传参 相当于拷贝一份相同的数组。
指针的用法 示例:
package main
import "fmt"
func main(){
var array *[4]int = new([4]int)
}
说明 var array *[4]int = new([4]int) 相当于 array := new([4]int)
后续使用该列表时是使用的同一个
多维数组
多维数组其实就是数组套数组 俗称列表套列表
使用方式为:var array [3][2]int = [3][2]int{{1,2},{3,4},{5,6}}相当于 array := [3][2]int{{1,2},{3,4},{5,6}}
注意 多维数组 必须只有一个是不定长数组,其他的都需要指定数组长度
数组比较
只有数组元素类型相同,长度相同,并且两边数组中的每个元素值都相等,数组才相等。 如果数组长度不对等 直接报错,如果数组长度对等 值不对等 是不相等的数组
切片合并
func main() {
s1 := []int{0, 1, 2, 3}
s2 := []int{4, 5, 6, 7}
s1 = append(s1, s2...)
fmt.Println(s1)
}
另一种简短指定下标的界定
var a [4]int = [4]int{0:1,3:4} 输出为[1,0,0,4] 相对等于 a := [4]int{0:1,3:4} 更加简短的可用 a := [...]int{0:1,3:4}
不写元素个数的叫做切片,写个数的叫做数组
另一种数组制定
s := make([]int,5) 为制定了5位数的数组类型
使用容量和整理容量
len(arr) 可以看到arr的使用容量 --数组使用长度 cap(arr) 可以查看arr的总体容量
注意 1.假如添加,有效长度超过整体容量的时候。 拓展容量长度是上次长度的整体倍数 超过1024字节的时候 下次拓展为上次的四分之一
2。容量 >=有效长度
- 切片打印只会打印有效长度
- 切片名本身就是数据地址 切片指向的就是原始数组那片地址