笔记整理全部整理于文档库页面 点我前往

数组(Array)

数组可以存放多个同一类型的数据, 在其他编程语言中,数组可能是一种引用类型,但是在Golang中,数组是值类型,数组的长度是固定的,不能动态变化,数组默认为值拷贝,会进行值拷贝且数组之间不会相互影响。长度是数组的一部分,不同长度代表不同的数据类型

数组的地址

数组的地址是首个元素的地址,地址是连续分布的,间隔取决于数组的类型占用的字节数

1
2
3
4
5
func main(){
var intarray [3]int // int64 占用8个字节
fmt.Printf("%p %p \n", &intarray, &intarray[0]) // 0xc00012c000 0xc00012c000
// 不难推断 &intarray[1] = 0xc00012c008 &intarray[2] = 0xc00012c010
}

数组的初始化

1
2
3
4
5
6
func main(){
var intArray1 [3]int = [3]int {1, 2, 3}
var intArray2 = [3]int {1, 2, 3}
var intArray3 = [...]int {1, 2, 3}
var intArray4 = [3]int {0: 1, 1: 2, 2: 3} //指定成员下标
}

数组的遍历

for 循环

1
2
3
4
5
6
func main(){
var intArray = [3]int {1, 2, 3}
for i := 0; i < len(intArray); i++ {
fmt.Println(intArray[i])
}
}

for - range 结构遍历

1
2
3
4
5
6
func main(){
var seasons = [4]string {"Spring", "Summer", "Autumn", "Winter"}
for index, value := range seasons{ // 不需要的参数可以用 _ 省略
fmt.Printf("[%d]%v \n",index,value)
}
}

二维数组

二维数组本质上是由一维数组组成的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
func main(){

// 二维数组的初始化
var num = [3][3]int{{1, 2, 3}, {2, 3, 4}, {4, 5, 6}}

var str = [2][2]string{}
str[0][0] = "name"
str[0][1] = "age"
str[1][0] = "Tom"
str[1][1] = "24"

// 二维数组的遍历
var i, j int
for i = 0; i < len(str); i++ {
for j = 0; j < len(str[i]); j++ {
fmt.Printf("%v \n", str[i][j] )
}
}

切片(Slice)

切片是引用类型,遵循引用传递的机制,切片可以为数组提供动态增长和缩小的需求,但其本身并不存储任何数据。

定义切片并引用一个数组

图片简单解析了定义切片并引用数组的过程,从底层来讲,Slice是一个Struct结构体,我们将在结构体部分详细讨论这个问题

image-20210716013818248

1
2
3
4
5
6
7
8
9
10
func main(){
var intarray = [...]int{1, 2, 3}
intslice := intarray[1, 2] // 2

var slice []int = []int{1, 2, 3} // 直接在定义切片的时候就指定具体数组

fmt.Printf("lenth = %d cap = %d", len(intslice), cap(intslice)) // len = 1 cap = 2
// 切片的容量 一般为切片长度的 x 2

}

使用make来创建切片

在用make方法创建的切片,内部的数组对外不可见,只能通过切片的下标访问内部数组,即上图的intarray数组

1
2
3
4
5
6
func main(){
var num []int = make([]int, 5, 10) // make一个int类型的切片,长度为5,容量为10,容量可省略
num[1] = 99
num[2] = 88
fmt.Println(num) // [0 99 88 0 0] // 没有给切片元素赋值默认为0
}

切片的遍历

由于和数组的大同小异,这里不再啰嗦,直接上代码

for 方法遍历

1
2
3
4
5
6
7
func main(){
var slice []int = []int{1, 2, 3}

for i := 0; i < len(slice); i++ {
fmt.Println(slice[i])
}
}

for - range 方法

1
2
3
4
5
6
7
func main(){
var slice []int = []int{1, 2, 3}

for i , _ := range slice{
fmt.Println(slice[i])
}
}

切片的扩容(Append)

1
2
3
4
func main(){
var slice []int = []int{1, 2, 3}
fmt.Println(append(slice, 4, 5))
}

切片的拷贝(Copy)

1
2
3
4
5
6
func main(){
var slice []int = []int{1, 2, 3}
var sliceNone = make([]int, 10)
copy(sliceNone, slice) // 将Slice的拷贝给sliceNone
fmt.Println(sliceNone) // [1 2 3 0 0 0 0 0 0 0]
}

String & Slice

String底层是byte数组,所以String也可以进行切片处理

1
2
3
4
5
func main(){
var str = "noreply@kulipoi.com"
strSlice := str[8:]
fmt.Println(strSlice)
}