array
数组声明--var arr [10]int,array由[n]<type>定义。n表示数组大小,type表示数组类型
声明且初始化--arr := [3]int{1,2,3}或者不写大小var arr := [...]int{1,2,3}或者var arr = [3]int{1,2,3},如果不写大小可以用三个点来表示,go会自动识别,var arr[3]int默认是初始化为0。
ps:记住:=和=之间的区别,如果是:=不需要var,如果是=需要var
二维数组初始化a := [2][2]int{ [2]int{1,2}, [2]int{3,4} },a := [2][2]int{ [...]int{1,2}, [...]int{3,4} },a := [2][2]int{ {1,2}, {3,4} }默认里面的类型就是int
数组同样是值类型的:将一个数组赋值给另一个数组,会复制所有的元素。尤其是当向函数内传递一个数组的时候,它会获得一个数组的副本,而不是数组的指针。
slice
slice 与array 接近,但是在新的元素加入的时候可以增加长度。slice 总是指向底层的一个array。slice 是一个指向array 的指针,这是其与array 不同的地方;slice 是引用类型, 这意味着当赋值某个slice 到另外一个变量,两个引用会指向同一个array。例如,如果一个函数需要一个slice 参数,在其内对slice 元素的修改也会体现在函数调用者中,这和传递底层的array 指针类似。
slice 总是与一个固定长度的array 成对出现。其影响slice 的容量和长度
arr := [10]int{1,2,3}slice := arr[0:5]slice1 := append(slice,4,5,6)fmt.Printf("slice1 len:%d, slice1 cap:%d\n",len(slice1),cap(slice1)) fmt.Printf("slice len:%d, slice cap:%d\n",len(slice),cap(slice))fmt.Printf("arr[0]=%d,arr[1]=%d,arr[2]=%d,arr[3]=%d,arr[6]=%d\n",arr[0],arr[1],arr[2],arr[3],arr[6])
arr[6] = 5,说明slice和slice1都指向了arr。更改slice和slice1将更改arr。
函数append 向slice s 追加零值或其他x 值,并且返回追加后的新的、与s 有相同类型的slice。如果s 没有足够的容量存储追加的值,append 分配一个足够大的、新的slice 来存放原有slice 的元素和追加的值。因此,返回的slice 可能指向不同的底层array。
也就是说当slice指向一个arr时,如果通过append增加slice的容量,如果增加的值的个数没有超过arr的长度,slice仍旧指向arr,如果超过了arr的长度,将分配一个新的slice来存放原来的slice。
make
可以通过make来创建一个长度为n的slice--sl := make([]int,6)
map
1 package main 2 3 import "fmt" 4 5 func main() { 6 monthdays := map[string]int{ 7 "Jan": 31, "Feb": 28, "Mar": 31, 8 "Apr": 30, "May": 31, "Jun": 30, 9 "Jul": 31, "Aug": 31, "Sep": 30, 10 "Oct": 31, "Nov": 30, "Dec": 31, //<--逗号是必须的11 } 12 13 fmt.Printf("%d\n", monthdays["Dec"])14 year := 015 for month,days := range monthdays {16 fmt.Printf("month :%s\n",month)17 year += days18 } 19 fmt.Printf("Numbers of days in a year: %d\n", year)20 var value int 21 var ok bool22 value, ok = monthdays["Jan"] //value将取到值,而ok则判断值是否真的取到23 if ok == true {24 fmt.Printf("value %d exists in map\n",value)25 } 26 }