Go语言中的数组与切片

数组与切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func test1() {
arr := [5]int{1, 2, 3, 4, 5}
// 切片是对数组的引用 因此切片是引用类型
slices := arr[1:3]
fmt.Println(slices) //[2 3]
// 切片的长度是指切片中元素的个数
fmt.Printf("slice的长度:%d\n", len(slices)) //slice的长度:2
// 切片的容量是指切片所指向的数组的元素到其最后一个元素的个数
fmt.Printf("slice的容量:%d\n", cap(slices)) //slice的容量:4

for _, v := range slices {
fmt.Println(v) //2 、3
}

// 切片的最大长度为其容量,修改切片的长度和容量一样,会显示出切片所指向数组的元素到其最后一个元素
slices = slices[:cap(slices)]
fmt.Printf("修改后:%v\n", slices) // 修改后:[2 3 4 5]

// 切片的地址是其所指向数组的第一个值的地址
fmt.Printf("slices的地址:%p,所指向数组值的地址:%p\n", slices, &arr[1])
//slices的地址:0xc00008e038,所指向数组值的地址:0xc00008e038
}

func main() {
test1()
}

切片的内存布局

切片的内存布局

切片的追加与拷贝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func test2() {
fmt.Printf("\n------------切片的追加与拷贝------------------\n\n")
slice1 := make([]int, 5, 10)
slice2 := []int{1, 2, 3, 4, 5}
fmt.Printf("slice1:%v,slice2:%v\n", slice1, slice2)
// 切片的追加
slice1 = append(slice1, slice2...)
fmt.Printf("slice1 append slice2:%v\n", slice1)
slice3 := make([]int, 10, 10)
// 切片的拷贝
copy(slice3, slice1)
fmt.Printf("slice3 copy slice1:%v", slice3)
}
func main() {
test2()
}
---------------------------------------------

slice1:[0 0 0 0 0],slice2:[1 2 3 4 5]
slice1 append slice2:[0 0 0 0 0 1 2 3 4 5]
slice3 copy slice1:[0 0 0 0 0 1 2 3 4 5]

string与slice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func test3() {
fmt.Printf("\n------------string与slice------------------\n\n")
// string的底层是一个byte的数组,因此也可以进行切片操作
str := "hello world"
slice1 := str[:]
fmt.Printf("slice:%v,len:%d\n", slice1, len(slice1))
// string本身是不可变的,因此,需要改变string中的字符,需要如下操作:
// slice1[0] = 'c' 错误的操作
str1 := []byte(str) //这里[]byte()是字节数组,如果操作中文,建议使用字符数组[]rune()
str1[0] = 'H'
str = string(str1)
fmt.Println(str)

str2 := "你好,世界"
str3 := []rune(str2)
str3[0] = '您'
str2 = string(str3)
fmt.Printf("处理中文:%v", str2)
}

func main() {
test3()
}
-----------------
slice:hello world,len:11
Hello world
处理中文:您好,世界

Go中string的底层布局

数组的排序与二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
func test4() {
fmt.Printf("\n------------数组排序------------------\n\n")
arr := [5]int{3, 2, 1, 5, 4}
//数组是值类型的传递 当作参数传递时,传递的是副本 因此sort不能直接对数组进行排序,需要传入数组的slice进行排序
sort.Ints(arr[:])
fmt.Printf("排序后:%v\n", arr)
strarr := [5]string{"A", "a", "C", "eafa", "aEf"}
sort.Strings(strarr[:])
fmt.Printf("排序后:%v\n", strarr)
fmt.Printf("\n------------数组查找------------------\n\n")
// sort.search返回的是排序后的元素位置
i := sort.SearchInts(arr[:], 5)
fmt.Printf("数字5在数组arr中的位置下标为:%v\n", i)
i1 := sort.SearchStrings(strarr[:], "a")
fmt.Printf("字母A在数组strarr中的位置下标为:%v\n", i1)
}

func main() {
test4()
}


------------数组排序------------------

排序后:[1 2 3 4 5]
排序后:[A C a aEf eafa]

------------数组查找------------------

数字5在数组arr中的位置下标为:4
字母A在数组strarr中的位置下标为:2