复合类型
pointer
array
slice(切片)
map(字典)
chan(通道)
struct
interface
对于元素是简单类型的array, slice, map等
都可以直接用fmt.Println直接进行打印输出所有元素
array
类型:
[n][m]...元素类型
[12] byte [23]*int [12]struct{x, y int}
[12][23]int === [12]([23]int),二维数组长度12,一维数组长度23
同C的: int arr[12][23];
数组长度
1、数组长度必须是常量、常量表达式
,即编译期已知
2、数组长度是数组类型的内置常量,len函数可以获取:
len(arr)
元素访问
1、下标访问,arr[i][j]
2、关键字
range
range返回两个参数:
数组下标 数组元素
for
i, v := range arr{...}
3、打印数组
1)、遍历数组,分别打印数组元素
2)、
fmt.Println(arr),直接打印数组所有元素
数组赋值
1、遍历赋值
2、声明时,一起赋值
var narr [3][4]int = [3][4]int{{1, 2, 3, 4}, {11, 12, 13, 14}, {21, 22, 23, 24}}
var narr [3][4]int = [3][4]int{{1, 2, 3, 4}, {11, 12, 13, 14}}
var narr [3][4]int = [3][4]int{{1, 2, 3}, {11, 12, 13, }}
var narr []int = []int{1, 2, 3, 4} //先定义一个匿名数组。然后赋值给narr
1)、未赋值的元素,初始化为0
2)、赋值长度大于数组长度时,编译报错
1、数组是一个值类型,不同于C
(修改数组实参的值,需要用到数组切片,即slice)
值类型:在赋值和参数传递时,进行复制
slice
数组切片,类似指向数组的指针,实际有自己的数据结构
数据结构:
1、指向原生数组的指针
2、数组切片中的元素个数
3、数组切片已分配的存储空间
创建数组切片
1、基于数组
var sl []int = narr[first:last]
1)、取值范围
下标[first, last)
2)、first、last可省略:分别表示从开头、到最后
2、基于数组切片
基本同基于数组的情况
last可以是数组切片的容量,即可大于数组切片的大小
3、直接创建
sl :=
make([]int, 5) //创建5个元素的数组切片
sl :=
make([]int, 5, 10) //创建5个元素的数组切片,但总共分配10个元素的空间
sl := []int{1, 2, 3, 4, 5}
数组切片的大小与容量
len(sl): 获取大小,同数组
cap(sl): 获取容量,数组切片的容量和大小可以不同
当数组切片的容量不够时,会自动扩展空间,可能涉及到数据的复制
元素访问
同数组
追加元素
sl =
append(sl, 1, 2, 3) //创建一个新的数组切片,元素依次为sl的所有元素,1,2,3
返回新创建的数组切片
sl =
append(sl, sl2...) //创建一个新的数组切片,元素依次为sl,sl2的所有元素
返回新创建的数组切片
sl2...:将sl2内的元素全部导出,然后附加到参数表
元素复制
1、直接相互赋值,会完全替换
sl = sl2
2、copy函数
copy(sl, sl2) //复制sl2的元素到sl,复制的大小取决于两个数组切片的长度较小的一方
map
类型:
map[KeyType] ValueType
声明变量后,还需要创建map,才能使用map型的变量
声明map型变量
var map1 map[int] string
创建map
map1 =
make(map[int] string)
map1 = make(map[int] string, 10) //创建时,指定容量
map1 = map[int] string{ //创建时,进行赋值
1 : "sun",
2 : "wang"
,//这里的逗号必须有,否则报语法错误
}
//如果写成一行代码,最后这个元素的后面的逗号可有可无
//如果多行写,这个逗号必须有
//同样适用于其他复合类型
map2 := make(map[int] string){ //创建时,进行赋值
1 : "sun",
2 : "wang",
}
元素赋值
map1[3] = "li"
元素删除
delete(map1, 3)
元素查找
v, b = map1[3]
v: 3对应的值
b: bool类型,是否找到对应的键值对