数组声明:编程
ArrayType = "[" ArrayLength "]" ElementType .数组
例如:app
var a [32] int函数
var b [3][5] inturl
在Go和C中,数组的工做方式有几个重要的差异。在Go中,spa
(1)数组是值类型。将一个数组赋值给另外一个,会拷贝全部的元素。指针
(2) 若是你给函数传递一个数组,其将收到一个数组的拷贝,而不是它的指针。blog
(3)数组的大小是其类型的一部分,类型[10]int和[20]int是不一样的。数组长度在声明后,就不可更改。索引
切片声明:ci
SliceType = "[" "]" ElementType .
例如:
var a []int
没有初始化的slice为nil。
切片(slice)对数组进行封装,实际上,切片能够当作大小能够动态变化的数组,这一点相似C++中std::vector。就像std::vector在实际C++编程中大量使用同样,Go中大多数的数组编程都是经过切片完成,而不是简单数组。
通常来讲,有两种方式来初始化切片:
(1)经过数组
var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var mySlice []int = myArray[:5]
(2)经过make
语法:
make([]T, length, capacity)
建立一个初始长度为5,容量为10为切片,切片的每一个元素都为0:
slice1 := make([]int, 5, 10)
建立一个长度为5的切片,并初始化切片的每一个元素:
slice2 := []int{1, 2, 3, 4, 5}
对于切片,最重要的特色就是长度是可变的:
slice2 := []int{1, 2, 3, 4, 5}
fmt.Println("slice:", slice2)
slice2 = append(slice2, 6)
fmt.Println("slice:", slice2)
输出:
slice: [1 2 3 4 5]
slice: [1 2 3 4 5 6]
函数append是GO专门为切片增长元素而提供的一个内建函数。
切片持有对底层数组的引用,若是你将一个切片赋值给另外一个,两者都将引用同一个数组。若是函数接受一个切片做为参数,那么其对切片的元素所作的改动,对于调用者是可见的,比如是传递了一个底层数组的指针。
func (f *File) Read(b []byte) (n int, err error)
这个os.File的Read方法,它接受一个切片参数,切片中的长度已经设定了要读取的数据的上限。对于C/C++,须要同时提供一个缓冲区的指针,和缓冲区的大小:
int read(File* f, char* buf, int len)
从这里能够看到,GO的写法要简单一些。
切片(数组)的遍历
在go语言中,遍历切片或者数组,有两种方式:
传统方式:
for i := 0; i <len(mySlice); i++ {
fmt.Println("mySlice[", i, "] =", mySlice[i])
}
使用range表达式
range表达式有两个返回值,第一个是索引,第二个是元素的值:
for i, v := range mySlice {
fmt.Println("mySlice[", i, "] =", v)
}
使用range让代码更加简洁,因此在go编程中也更加经常使用。
做者:YY哥
出处:http://www.cnblogs.com/hustcat/ 本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。