当前位置: 代码迷 >> 综合 >> golang 中 array,slice,map 三个的理解和区别
  详细解决方案

golang 中 array,slice,map 三个的理解和区别

热度:52   发布时间:2023-12-05 19:01:39.0

array

array是由[n]<byte>定义,其中的n标识array的长度,而<type>标示希望存储的类型。对array的赋值或索引是由方括号完成的:var  arr  [10]intarr[0] = 21arr[1] = 123fmt.printf("The first element  is %d\n", arr[0]);var  arr  [10]int这样的数组是有固定的大小的。大小是类型的一部分。由于不同的大小的是不同的类型,因此不能改变大小。数组同样是值类型的:将一个数组赋值给另一个数组,会复制所有的元素。尤其当向一个函数传递一个数组的时候,他会获得一个数组的副本,而不是数组的指针。声明数组:    var  a  [10]int    (默认其中的值全部是0)复合声明:  a := [3]int{1, 2, 3}    也可以写成 a = [....]int{1, 2, 3, 4}, GO会自动的统计元素的个数。多维数组:  a := [3][2]int{ {1, 2}, {3, 4}, {5, 6}}

slice

 slice和array接近,不过更加的灵活,可以在新的元素加入的时候增加长度。slice总是指向底层的一个array。slice是一个指向array的指针,这是其与array不同的地方;slice是一个指向array的指针,这是其与array不同的地方;slice是引用类型,这意味着当赋值某个slice到另外一个变量,两个引用会指向同一个array。 例如,如果一个函数需要一个slice参数,在其内对slice元素的修改也会体现在函数调用者中,这和传递底层的array指针类似。创建:   sl := make([]int, 10)  创建了一个保存有10个元素的slice。(注意!!引用类型使用make创建)slice总是与一个固定长度的array成对出现。其影响slice的容量和长度。可以这样进行创建:int :     var  array[m]int然后对这个数组进行创建slice:  slice := array[0:n]    (这个slice指向变量array, 从序号0开始,结束在序号n之前,里面是0----n-1,注意数组的下角标是从0开始的)内建函数:append 和copyappend: 向slice追加零值或者其他的x值,并且返回追加后的新的slice。如果原来的slice没有足够的容量,那么append会分配一个足够大的,新的slice来存放原来的slice和后面追加的值。因此返回的slice可能和原来的不是指向同一个array.

  s0 := []int {0, 0}

   s1 := append (s0, 1)               //追加一个元素,s1 = []int {0, 0, 1}s1 := append (s0, 1, 2, 3)       //追加多个元素, s1 = []int {0, 0, 1, 2, 3}s1 := append (s0, s1)            //追加一个slicecopy:从源src复制到目标dst, 并且复制的元素的个数。var a = [...]int{1, 2, 3, 4, 5, 6, 7, 8}var  s = make([]int, 6)n1 : = copy(s, a[0:])               ---->n1 = 6, s = =[] int {1, 2, 3, 4, 5, 6}n2 := copy(s, s[2:])             ------>n2 = 4, s ==[] int {3, 4, 5, 6,  5, 6}

map

   map可以认为是一个用字符串做索引的数组。定义如下: map [from  type]  <to  type>mothday :=  map[string]<int> {"jan" : 31, "feb", 29 .......}只需要声明一个map的时候,可以使用make形式:   mothday  := make(map [string]<int>)注意!!当对array, slice, string或者map循环遍历的时候,range会帮助你,每次调用都会返回一个健和对应的值。可以对map进行添加,类似于数组,   mothday["mnb"] =  30可以进行删除,  delete(mothday, "mnb")
  相关解决方案