go语言基础教程2

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 := 0
15     for month,days := range monthdays {
16         fmt.Printf("month :%s\n",month)
17         year += days
18     }   
19     fmt.Printf("Numbers of days in a year: %d\n", year)
20     var value int 
21     var ok bool
22     value, ok = monthdays["Jan"] //value将取到值,而ok则判断值是否真的取到
23     if ok == true {
24         fmt.Printf("value %d exists in map\n",value)
25     }   
26 }