Go语言学习笔记 -- array、slice和map
2017-03-01 20:46
776 查看
array
array由
像 var arr [10]int 这样的数组类型有固定的大小。大小是类型的一部分。由于不同的大小是不同的类型,因此不能改变大小。数组同样是值类型的:将一个数组赋值给另一个数组,会复制所有的元素。所以当传递一个数组给一个函数时,它将获取到一个数组的副本,而不是指针。
可以像这样声明一个数组 var a [3]int,如果不使用0来初始化它,可以像下面这样声明 a := [3]int{1,3,4} 或者简写为 a := […]int{1,2,3} ,Go会自动统计它的个数。
注意,所有项目必须制定。如果你使用多维数组,有一些内容你必须录入:
slice
slice与array接近,但是在新的元素加入的时候可以增加长度,slice总是指向底层的一个array。slice是指向array的一个指针,这是其与array不同的地方;slice是引用类型,这意味着当赋值某个slice到另外一个变量,两个引用会指向同一个array。所以将slice作为函数参数传入时,如果修改slice指向的输入,则修改也会体现在调用者中。可以像下面这样定义:
创建了一个保存10个元素的slice,需要注意的是底层的array并无不同,slice总是与一个固定长度的array成对出现,其影响slice的长度和容量。
给定一个array或slice,通过a[I,J]的方式创建一个新的slice,则这个slice指向a,从序号I开始,结束语J之前,长度是J-I。
如果对超出范围的下标访问slice,会得到一个运行时错误。
如果你想扩展一个slice,有一堆内建函数可以用:append 和 copy。
函数 append 向 slice s 追加零值或其他 x 值,并且返回追加后的新的、与 s有相同类型的 slice。如果 s 没有足够的容量存储追加的值,append 分配一个足够大的、新的 slice 来存放原有 slice 的元素和追加的值。因此,返回的 slice 可能指向不同的底层 array。
函数 copy 从源 slice src 复制元素到目标 dst,并且返回复制的元素的个数。源和目标可能重ඏ。元素复制的数量是 len(src) 和 len(dst) 中的最小值。
map
许多语言内建了该类型,比如Perl有哈希,Python有字典。Go中的map可以认为是一个字符串做索引的数组
一般定义map的方法
当只需声明一个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”)
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语言学习笔记(四) [array、slice、map]
- Go语言学习笔记(四) [array、slice、map]
- Go语言学习笔记(四) [array、slice、map]
- Go语言学习三:Go基础(iota,array,slice,map,make,new)
- 35.笔记go语言——array、slices和map
- Go语言中的Array、Slice、Map和Set使用详解
- Golang学习笔记(四):array、slice、map
- go语言学习笔记之slice用法
- Go语言学习(二):array、slices和map
- 8.笔记go语言——复杂类型struct,slice,map
- Go语言中的 Array, Slice和 Map
- Go语言_array,slice,map
- Go语言学习笔记之数组、数组切片和map
- Go语言中的Array、Slice、Map和Set使用详解
- 二、slice和数组的区别,map的注意事项 -go语言笔记
- go语言的array,slice和map
- Go语言中的 Array, Slice和 Map
- Go语言学习笔记2——数组和Slice
- Go语言 array,slice,map
- Go 语言中的 Array,Slice,Map 和 Set