array
array是由[n]<byte>定义,其中的n标识array的长度,而<type>标示希望存储的类型。对array的赋值或索引是由方括号完成的:
var arr [10]int
arr[0] = 21
arr[1] = 123
fmt.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 和copy
append: 向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) //追加一个slice
copy:从源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")