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")