您的位置:首页 > 编程语言 > Go语言

Go语言学习笔记 -- array、slice和map

2017-03-01 20:46 776 查看
array

array由
<type>
定义,n表示数组的长度,type表示希望存储的内容类型。数组元素的复制和访问通过方括号和下标完成:

var a [10]int
a[0] = 10
a[1] = 12
fmt.Printf("%v\n", a)


像 var arr [10]int 这样的数组类型有固定的大小。大小是类型的一部分。由于不同的大小是不同的类型,因此不能改变大小。数组同样是值类型的:将一个数组赋值给另一个数组,会复制所有的元素。所以当传递一个数组给一个函数时,它将获取到一个数组的副本,而不是指针。

可以像这样声明一个数组 var a [3]int,如果不使用0来初始化它,可以像下面这样声明 a := [3]int{1,3,4} 或者简写为 a := […]int{1,2,3} ,Go会自动统计它的个数。

注意,所有项目必须制定。如果你使用多维数组,有一些内容你必须录入:

arr := [3][2]int{[2]int{1, 2}, [2]int{3, 4}, [2]int{5, 6}}

//上面的表达式也可以简写为
arr := [3][2]int{[...]int{1,3}, [...]int{3,5}, [...]int{4,6}}

//或者
arr := [3][2]int{{1,2},{3,4}, {5,6}}


slice

slice与array接近,但是在新的元素加入的时候可以增加长度,slice总是指向底层的一个array。slice是指向array的一个指针,这是其与array不同的地方;slice是引用类型,这意味着当赋值某个slice到另外一个变量,两个引用会指向同一个array。所以将slice作为函数参数传入时,如果修改slice指向的输入,则修改也会体现在调用者中。可以像下面这样定义:

slice := make([]int, 10)


创建了一个保存10个元素的slice,需要注意的是底层的array并无不同,slice总是与一个固定长度的array成对出现,其影响slice的长度和容量。

var arr [10]int

sl := arr[0:8]

fmt.Printf("len(sl) = %d\n", len(sl))
fmt.Printf("cap(sl) = %d\n", cap(sl))
fmt.Printf("len(arr) = %d\n", len(arr))
fmt.Printf("cap(arr) = %d\n", cap(arr))

//输出结果
len(sl) = 8
cap(sl) = 10
len(arr) = 10
cap(arr) = 10


给定一个array或slice,通过a[I,J]的方式创建一个新的slice,则这个slice指向a,从序号I开始,结束语J之前,长度是J-I。

a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 = a[0:2] //创建新的slice,包含元素1,2
s2 = a[:4]  //创建新的slice,包含元素1,2,3,4
s3 = a[:]   //创建新的slice, 包含所有元素
s4 = s1[:]


如果对超出范围的下标访问slice,会得到一个运行时错误。

func main() {
sl := make([]int, 100)
sl[99] = 100
sl[100] = 10
}
//运行结果

panic: runtime error: index out of range

goroutine 1 [running]:
main.main()
D:/go_test/hello.go:7 +0x39


如果你想扩展一个slice,有一堆内建函数可以用:append 和 copy。

函数 append 向 slice s 追加零值或其他 x 值,并且返回追加后的新的、与 s有相同类型的 slice。如果 s 没有足够的容量存储追加的值,append 分配一个足够大的、新的 slice 来存放原有 slice 的元素和追加的值。因此,返回的 slice 可能指向不同的底层 array。

s1 := []int{0, 0}
fmt.Printf("%v\n", s1)
s2 := append(s1, 2)
fmt.Printf("%v\n", s2)
s3 := append(s2, 3, 7, 5)
fmt.Printf("%v\n", s3)
s4 := append(s3, s1...)  //注意后面的3个点
fmt.Printf("%v\n", s4)

//执行结果
[0 0]
[0 0 2]
[0 0 2 3 7 5]
[0 0 2 3 7 5 0 0]


函数 copy 从源 slice src 复制元素到目标 dst,并且返回复制的元素的个数。源和目标可能重ඏ。元素复制的数量是 len(src) 和 len(dst) 中的最小值。

a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s := make([]int, 6)

n1 := copy(s, a[:6])
fmt.Printf("n1 = %v , s = %v\n", n1, s)
n2 := copy(s, a[1:4])
fmt.Printf("n1 = %v , s = %v\n", n2, s)

//执行结果
n1 = 6 , s = [1 2 3 4 5 6]
n1 = 3 , s = [2 3 4 4 5 6]


map

许多语言内建了该类型,比如Perl有哈希,Python有字典。Go中的map可以认为是一个字符串做索引的数组

一般定义map的方法
map [<fromtype>] <totype>


monthdays := map[string]int {
"Jan":31
"Feb:18
}


当只需声明一个map的时候,使用make的形式:monthdays = make(map[string]int),当在map中索引时,使用方括号 fmt.Printf(“%d\n”, monthdays[“Jan”])

当对array 、slice 和map进行循环遍历的时候,使用range,前面已有讲解

向map中增加元素

monthdays[“Sat”] = 20

判断map中元素是否存在:

v,ok := monthdays[“Jan”] //当元素存在时,ok为true

从map中删除元素

delete(monthdays, “Jan”)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  go语言