Go语言基础学习笔记之数组、切片、map | 青训营

117 阅读4分钟

数组

数组是同一种数据类型元素的集合。数组是最简单的数据结构之一,是具有相同唯一类型的一组已编号且长度固定的数据项序列。在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则适用于键值对的存储和快速检索的场景。通过使用这些数据结构能够帮助我更好地处理和组织数据。