title: Go数据结构与算法-数组
tags: go,算法
介绍
算法是基于复合数据的之上的,只有当数据超过2个及以上的时候,我们才考虑它们的排序、查询等问题。我们首先要了解下go语言中两种复合数据类型:
- 数组(Array)
- 切片(Slice)
数组跟切片都是指向同一类型数据的集合,如int、string、float等数据类型。数组中包含的每个数据被称为数组元素,一个数组包含的元素个数称为数组的长度。
数据和切片是有区别的,数组是定长的,声明的时候我们必须要指定数组的长度;切片是变长的,它可以根据元素的增删自动改变数组的长度。我们也可以把切片当成是一个动态数组。从效率角度来看数组的效率优于切片。但在实际开发中,切片应用场景多一点。
不管是数组还是切片都具有以下性质:
- 查找原素迅速
- 插入元素困难
- 排序速度慢
简单演示
func MyArray() {
a := [7] int{1,2,3,4,5,6,7} // 数组, 一开始就分配好了内存,大小限定,不能拓展
b := []int{1, 2, 3, 4, 5, 6, 7} // 切片,大小没有限定,可以动态拓展
for _, i := range a{
fmt.Printf("a 数组遍历 %d\n", i)
}
for _, j := range b{
fmt.Printf("b 切片遍历 %d\n", j)
}
// 输出数组的第二个元素
fmt.Printf("a的第二个元素 %d\n", a[1])
// 输出切片的第五个元素
fmt.Printf("b的第五个元素 %d\n", b[4])
}
性能测试
新建 Array_test.go
package main
import "testing"
func BenchmarkArr(b *testing.B){
for i:=0; i<b.N;i++ {
Arr()
}
}
func BenchmarkSli(b *testing.B) {
for i:=0; i<b.N;i++ {
Sli()
}
}
打开终端分别执行
go test -run=xxx -bench=BenchmarkArr -benchtime="3s" -cpuprofile profile_cpu.out
go test -run=xxx -bench=BenchmarkSli -benchtime="3s" -cpuprofile profile_cpu.out
通过测试结构我们可以明显的看到数组的整体效率优于切片。