数组
数组是同一种数据类型元素的集合。数组是最简单的数据结构之一,是具有相同唯一类型的一组已编号且长度固定的数据项序列。在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。 基本语法:
// 定义一个长度为3元素类型为int的数组a
var a [3]int
1.数组声明
- 先声明后初始化直接初始化
声明数组的类型、大小
var myint [5]int
对数组进行赋值
for i := 0; i < 5; i++ {
myint[i] = i
}
- 直接初始化
一维数组:
var 数组名 [数组大小] 数组元素的数据类型{} //{}代表将数组声明的同时将他初始化一下
例如:
var testnumber = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
多维数组:
二维数组是最简单的多维数组
声明方式如下:
var 数组名 [][][]...[][]数组类型
二维数组声明
var 数组名 [x][y] 数据类型
可以认为x是行y是列
例如:
var mynumber= [2][3]int{{1, 2, 3},
{2, 3, 4}}
2.数组的遍历 遍历数组a有以下两种方法:
func main() {
var a = [...]string{"北京", "上海", "深圳"}
// 方法1:for循环遍历
for i := 0; i < len(a); i++ {
fmt.Println(a[i])
}
// 方法2:for range遍历
for index, value := range a {
fmt.Println(index, value)
}
}
切片
数组大小限定长度限定并且不可以进行扩容,在固定的条件下非常局限。切片是一个引用类型,它的内部结构包含地址、长度和容量,其可以实现对数组的动态切割,可以进行切割、裁剪。
1.切片的定义
声明切片类型的基本语法如下:
var name []T//name:表示变量名,T:表示切片中的元素类型
举个例子:
func main() {
// 声明切片类型
var a []string //声明一个字符串切片
var b = []int{} //声明一个整型切片并初始化
var c = []bool{false, true} //声明一个布尔切片并初始化
var d = []bool{false, true} //声明一个布尔切片并初始化
fmt.Println(a) //[]
fmt.Println(b) //[]
fmt.Println(c) //[false true]
fmt.Println(a == nil) //true
fmt.Println(b == nil) //false
fmt.Println(c == nil) //false
// fmt.Println(c == d) //切片是引用类型,不支持直接比较,只能和nil比较
}
2.基于数组定义切片
由于切片的底层就是一个数组,所以我们可以基于数组定义切片。
func main() {
// 基于数组定义切片
a := [5]int{55, 56, 57, 58, 59}
b := a[1:4] //基于数组a创建切片,包括元素a[1],a[2],a[3]
fmt.Println(b) //[56 57 58]
fmt.Printf("type of b:%T\n", b) //type of b:[]int
}
还支持如下方式:
c := a[1:] //[56 57 58 59]
d := a[:4] //[55 56 57]
e := a[:] //[55 56 57 58 59]
如果你想声明一个拥有初始长度或规定容量的切片(可以指定切片的长度和容量),可以使用 make() 函数来创建切片:
var slice1 []type = make([]type, length, capacity)
也可以简写为
slice1 := make([]type, length, capacity)
举个例子:
func main() {
a := make([]int, 2, 10)
fmt.Println(a) //[0 0]
fmt.Println(len(a)) //2
fmt.Println(cap(a)) //10
}
上面代码中a的内部存储空间已经分配了10个,但实际上只用了2个。 容量并不会影响当前元素的个数,所以len(a)返回2,cap(a)则返回该切片的容量。
map Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。Go语言中的map是引用类型,必须初始化才能使用。
1.map定义
Go语言中map的定义语法如下:
map[KeyType]ValueType
其中, KeyType:表示键的类型。 ValueType:表示键对应的值的类型。 map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:
make(map[KeyType]ValueType, [cap])//cap表示map的容量
其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。 注意:定义map,key值必须是可Hash,用的最多的是数字和字符串 2.map基本使用 map中的数据都是成对出现的,map的基本使用示例代码如下:
func main() {
scoreMap := make(map[string]int, 8)
scoreMap["小白"] = 75
scoreMap["小明"] = 100
fmt.Println(scoreMap)
fmt.Println(scoreMap["小明"])
fmt.Printf("type of a:%T\n", scoreMap)
}
输出:
map[小明:100 小白:75]
100
type of a:map[string]int
个人思考
数组、切片、map这些数据结构在Go语言中都有着重要的作用,适用于不同的场景。数组适用于固定长度、顺序访问的场景;切片则更加灵活,适用于动态大小、快速插入和删除的场景;而Map则适用于键值对的存储和快速检索的场景。通过使用这些数据结构能够帮助我更好地处理和组织数据。