Go语言中的 Array, Slice和 Map

介绍

曾经学习python的时候,记得书上说 dict 是 python的 horsepower(动力)。然后,Slice 和 Map 又何尝不是 golang 的 workhorse 呢?

Array 的用法

数组的声明(这里就是定义,给数据存储分配了空间): var arrayName [arraySize] dataType

如果数组定义好之后, 没有给数组元素指定值,那么所有元素被自动初始化为零值。

数组的初始化c = […]int {1, 2, 3, 4, 5} //由初始化列表决定数组长度,不可省去标识符 “…”,否则将变成切片Slicevar d = [10]{2:4, 5:7} //可以按照下标来进行初始化数组的访问,可以直接按照下标进行访问数组的遍历:package mainimport(“fmt”)func main() {var f = [20]int {1, 1}for i := 2; i < 20; i++ {f[i] = f[i-1] + f[i-2]}for i := 0; i < 20; i++ { //采用下标进行遍历if i % 5 == 0 {fmt.Printf(“\n”)}fmt.Printf(“f[%2d] = %4d”,i , f[i])}}

也可以采用 range 关键字进行遍历:

func main() {var f = [:= 2; i < 20; i++ {f[i] = f[i-1] + f[i -2]}for i , v := range f { //采用 range 关键字 进行遍历fmt.Printf(“f[%2d] = %4d”, i, v)}}多维数组 var a [3][4]int 初始化 var a = [3][4]int {{1,2}, {1,2,3,4}, {2,3, 4}} 多维数组遍历/*找到二维数组中的最大元素*/package mainimport “fmt”func main() {var i, j, row, col, max intvar a = [3][4]int {{1, 3, 7, 3}, {2, 3, 7 , 9}, {22, 3, 5, 10}}max = a[0][0]for i := 0; i < = 2; i ++ {for j := 0; j <= 3; j++ {if a[i][j] > max {max = a[i][j]row = icol = j}}}fmt.Println(“max = %d, row = %d, col = %d\n”, max, row, col)}Slice 的用法Slice 的声明(没有分配内存) `var s1 []int`Slice 的创建 (分配了内存)

三种创建方式: 基于底层数组创建,直接创建,或者 make() 函数创建

基于底层数组创建 slicevar slice1 []int //声明但是不分配空间slice1 = array[start:end] //这里不包含 endslice2 := array[:]// 引用全部的元素slice3 := array[0:len(array)]var slice4 []intsliec34 = array //引用全部的元素直接创建 slice

在声明的时候,直接初始化。

var slice1 = []int {1 ,2, 3, 4, 5}make() 函数创建 slicevar slice1 = make([]int, 5) //长度和容量都是 5var slice2 = make([]int, 5, 10) //容量是5.Slice 的 访问和遍历

采用下标进行访问,采用 range 进行遍历。

packge mainmain() {, 4, 5}//使用下标访问 slicefor i := 0; i <=4; i++ {fmt.Println(“slice[%d] = %d”, i, slice[i])}fmt.Println()//使用range 进行遍历for i, v := range slice {fmt.Println(“slice[%d] = %d”, i, v)} }Slice 的操作

Slice 中的切片的元素,可以动态的添加和删除,所以操作起来要比数组更加方便。

切片元素的增加

采用内建函数 append() 向切片尾部,增加新的元素, 这些元素保存到底层的数组。

append() 添加元素的个数超过 切片的 cap() 的时候,那么底层会 重新分配一个 “足够大” 的内存,一般来说是将原来的内存空间扩大二倍,然后将数据复制到新的内存中去, 原来的空间会保留 (供原先切片使用)(底层数组变化这个问题,应该关注一下) 举例如下:package mainmain() {//使用make 创建 切片var slice1 = make([]int, 3, 6)// 使用 append 添加元素,并且未超出 capslice2 := append(slice1, 1, 2, 3)// 使用 append 添加元素,并且超出 cap. 这个时候底层数组会变化,新增加的元素只会添加到新的底层数组,不会覆盖旧的底层数组。slice3 := append(slice1, 4, 5, 6, 7)slice1[0] = 10fmt.Printf(“len = %d cap = %d %v\n”, len(slice1), cap(slice1), slice1)fmt.Printf(“len = %d cap = %d %v\n”, len(slice2), cap(slice2), slice2)fmt.Printf(“len = %d cap = %d %v\n”, len(slice3), cap(slice3), slice3)}程序输出是:]]=] //这里第一个元素没有变成10,,并且容量变成原来的2倍。切片元素的复制都可以…孔子的,老子的. 孙子的…都可以

Go语言中的 Array, Slice和 Map

相关文章:

你感兴趣的文章:

标签云: