GO语言的数组array与切片slice详解

  GO语言数组(array)

  在GO语言中,数组是用于存储相同数据类型的集合,数组长度必须是一个常量表达式,且是一个非负数

  GO语言中的数组是一种值类型,下文会介绍

  GO语言数组定义的格式

  var 数组名称 [数组长度]数组类型

  例:

  var arr [3]int

  输出为:

  [0 0 0]

  在GO语言中,初始化数组时,给定了数组长度,但没给定数组下标的值,类型默认值为,类型默认为空值,这是常用的两种类型

  GO语言数组的赋值操作

  // 第一种赋值操作

  var arr = [3]int{1,2,3} //直接将值初始化,不同的类似初始化值不相同

  // 第二种赋值操作

  var arr [3]int // 初始化数组变量

  arr[1] = 1 // 给数组的下标赋值

  // 第三种赋值操作

  var arr = [3]string{1:"one",2:"two"}

  // 一般常用的就这三种,其它方式都是一些变相的操作,这里不做介绍

  有必要说明一下:数组在初始中给定了数组的长度,用可以得到数组的长度,如果赋值时操出数组的最大长度,在编译的时候将会报错

  先来个练习加深下前面所说的影响,将一个int型数组的值全部乘以2

  package main

  import "fmt"

  func main(){

  var arrs = [5]int{1, 2, 3, 4, 5}

  for i, v := range arrs {

  arrs[i] = v * 2

  fmt.Printf("index is %d,value is %d

  ", i, arrs[i])

  }

  }

  输出为

  index is 0,value is 2

  index is 1,value is 4

  index is 2,value is 6

  index is 3,value is 8

  index is 4,value is 10

  GO语言数组的值类型

  在GO语言中,数组的存储是一种值的类型,不像C等其它语言是指向首元素的指针,所以在创建数组也可以通过 来创建一个指针数组

  例:

  var arr1 = new([5]int)

  var arr2 [5]int

  输出分别为

  &[0 0 0 0 0]

  [0 0 0 0 0]

  符号熟悉么,没错,他表明这是一个指针数组,在函数中传递时,不用将数组的值进行复制一遍

  GO语言多维数组

  在某种程度上面来说,多维数组其实就是将多个一维数组进行嵌套一种表达方式,例如:输出为如果尝过其它语言编程的人一看就明白是怎么回事了

  做个小题目:定义一个空的二维数组,将二维数组的值与索引一至

  package main

  import "fmt"

  func main{

  var arr_more [5][5]int

  fmt.Println(arr_more)

  for i, x := range arr_more {

  for i1, _ := range x {

  arr_more[i][i1] = i1

  }

  }

  fmt.Println(arr_more)

  }

  输出

  初始化数组:

  [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]

  值与索引对应

  [[0 1 2 3 4] [0 1 2 3 4] [0 1 2 3 4] [0 1 2 3 4] [0 1 2 3 4]]

  数组的处理还有很多别的形式,等着你在实际工作中的发现与总结

  GO语言切片(slice)

  切片是对数组一个连续片段的引用,它是一个引用类型,存储的是指针,所以在性能上比值数组更快,使用方法和数组基本类似,也可以通过索引进行访问,获得切片的长度,获得切片最大的长度

  GO语言切片声明格式

  var 声明变量 []变量类型

  和声明数组非常相似,切片的声明是不需要指定数组长度,因为切片的长度是可变的(等会介绍)

  一个切片在初始化之前默认为,长度为一个相对完整的例子:

  package main

  import "fmt"

  func main{

  var arr = [5]int{1, 2, 3, 4, 5}

  var slice []int

  fmt.Printf("初始化切片默认 %d

  ", slice)

  var slice1 []int = arr[:]

  fmt.Printf("切片复制数组(简写) %d

  ", slice1)

  var slice2 []int = arr[0:2]

  fmt.Printf("切片获得数组0-1的下标 %d

  ", slice2)

  var slice3 []int = arr[2:5]

  fmt.Printf("切片获得数组2-4的下标 %d

  ", slice3)

  }

  输出

  初始化切片默认 []

  切片复制数组(简写) [1 2 3 4 5]

  切片获得数组0-1的下标 [1 2]

  切片获得数组2-4的下标 [3 4 5]

  上面的例子介绍了切片的初始化和获得数组中某一个片段的值,当然还有一些其他用法比如,等等,切片的灵活性非常高,就看你需要什么数组的哪个片段

  注意 绝对不要用指针指向 slice。切片本身已经是一个引用类型,所以它本身就是一个指针!!

  GO语言用make()创建一个切片

  当相关的数组还没有创建好的时候,我们可以用函数来创建一个切片,同时创建好相关联的数组

  var slice []int = make([]type,len,cap)

  var 切片变量 []切片类型 = make([]数组类型,数组长度,最大长度) cap是可选参数

  通过一个例子来说明make的使用

  package main

  import "fmt"

  func main() {

  var slice1 []int = make([]int, 5)

  for i := 0; i < len(slice1); i++ {

  slice1[i] = 5 * i

  fmt.Printf("Slice at %d is %d

  ", i, slice1[i])

  }

  fmt.Printf("

  The length of slice1 is %d

  ", len(slice1))

  fmt.Printf("The capacity of slice1 is %d

  ", cap(slice1))

  }

  输出

  Slice at 0 is 0

  Slice at 1 is 5

  Slice at 2 is 10

  Slice at 3 is 15

  Slice at 4 is 20

  The length of slice1 is 5

  The capacity of slice1 is 5

  make()函数在初始化切片是经常被使用的方式,当然你要用简单的也可以,看习惯

  GO语言切片的复制与追加

  通过与来进行操作

  一个例子:

  package main

  import "fmt"

  func main(){

  sl_from := []int{1, 2, 3}

  sl_to := make([]int, 10)

  n1 := copy(sl_to, sl_from)

  fmt.Println(sl_to)

  fmt.Printf("Copied %d elements

  ", n1) // n == 3

  sl3 := []int{1, 2, 3}

  sl3 = append(sl3, 4, 5, 6)

  fmt.Println(sl3)

  }

  输出:

  [1 2 3 0 0 0 0 0 0 0]

  Copied 3 elements

  [1 2 3 4 5 6]

  复制与增加需要注意的:

  小记:

  当然切片还有更多的细节及处理方式,完整版最好还是去看官方提供的文档,本篇重点介绍了GO的数组与切片

  更多关于GO语言的数组array与切片slice知识请查看下面的相关链接

  您可能感兴趣的文章: