友情提示:此篇文章大约需要阅读 5分钟14秒,不足之处请多指教,感谢你的阅读。
在 Go 语言中,为便于存储及管理用户数据,其数据结构设计分为数组 Array、切片 Slice、映射 Map 三种结构。
近期又看了 Go 语言基础的内容,看了一下这三种结构实现的原理:
一旦声明了数组,其本身的数据类型及长度都是不可以进行变更。
// 使用数组字面量声明数组
array := [5]int{1, 2, 3, 4, 5}
// 自动推导长度声明数组
array := [...]int{1, 2, 3, 4, 5, 6}
// 使用 ... 代替长度,根据初始化元素个数推导
// 声明数组并指定特定元素值
array := [5]int{1:10, 2:20}
数组元素的类型可以为任何内置类型,也可以是某种结构类型,也可以是指针类型。
// 声明一个元素长度为 3 的指向字符串的指针数组
var array1 [3]*string
// 为指针数组指定元素
*array1[0] = "demo0"
*array1[1] = "demo1"
*array1[2] = "demo2"
数组本身是一维数据,多维数组是由多个数组组合而来的。
// 声明一个二维数组
var array = [3][2]int
// 声明了一个两个维度为 3 和 2 的元素
// 初始化二维数组
var array = [3][2]int{ {1, 2}, {3, 4}, {5, 6}}
在函数间传递数组:由于在函数间传递变量时,传递的总是变量的值的副本,所以在传递数组变量时将拷贝整个数组!在定义函数时,对于较大的数据类型应该把参数设计为指针类型,这样在调用函数时,只需在栈上分配给每个指针8字节的内存,但这意味着会改变指针指向的值(共享的内存),其实大部分情况下应该使用切片类型,而不是数组。
slice
是引用类型,它引用了其指针字段所指向的底层数组的一部分或全部;append
来实现的;切片类型有3个字段:
// 使用 make 创建一个切片
slice := make([]int, 3)
// 创建一个具有长度和容量的切片
slice := make([]int, 1, 6)
// 长度为 1,容量为 6 个元素
// nil 字符串切片
var slice []string
// 空切片
slice := []int{}
// 空的整形切片
由于切片只是引用了底层数组,底层数组的数据并不属于切片本身,所以一个切片只需要 24字节的内存(在 64位机器上):指针字段 8字节、长度字段 8字节、容量字段 8字节。所以在函数之间直接传递切片是高效的,只需分配 24字节的栈内存。
len
函数可返还切片的长度、cap
函数可返还切片的容量。
// 创建一个映射 存储学生信息
students := map[string]string{
"name" : "mengxiaoyu",
"age" : "22",
"sex" : "boy",
"hobby": "pingpang",
}
// 显示映射所有信息
for key, value := range students{
fmt.printf("key:%s, \t value:%s\n", key, value);
}
遍历映射的键值对时的顺序是随机,若要有序的获得映射的键值对,则需要先遍历出映射的键存到一个切片中,然后排序该切片,最后遍历该切片,按切片中元素的顺序去映射中取对应的值。