1.使用方式java
数组和slice长的很像,操做方式也都差很少,而且slice包含了数组的基本的操做方式,以下标、range循环,还有一些如len()则是多种类型共用,因此根据操做根本搞不清数组和切片的区别,可以看出区别的地方主要看如何声明的。数组
数组的声明方式很单一,一般就是下面这样:app
array1 := [5]int{1, 2, 3, 4, 5} array2 := [5]int{}
slice的声明方式就很是多样了,如前面介绍的几种:函数
var slice1 = []int{1, 2, 3, 4, 5} var slice2 = make([]int, 0, 5) var slice3 = make([]int, 5, 5) var slice4 = make([]int, 5)
加上对数组的切片和append操做都会产生数组切片(slice)spa
2.值传递or引用传递.net
func arrayModify(array [5]int) { newArray := array newArray[0] = 88 } func sliceModify(slice []int) { newSlice := slice newSlice[0] = 88 } func main() { array := [5]int{1, 2, 3, 4, 5} slice := []int{1, 2, 3, 4, 5} arrayModify(array) sliceModify(slice) fmt.Println(array) fmt.Println(slice) }
输出指针
[1 2 3 4 5] [88 2 3 4 5]
其实不仅是数组,go语言中的大多数类型在函数中看成参数传递都是值语义的。也就是任何值语义的一种类型看成参数传递到调用的函数中,都会通过一次内容的copy,从一个方法栈中copy到另外一个方法栈。这对于熟练java的同窗须要进行一次完全的观念转变,在java中除了少数的值类型是按照值传递,全部的类在函数传递时都是具备引用语义的,也就是经过指针传递。因此在使用时传递对象,不须要去分别值和引用。code
go说到底不是一种纯粹的面向对象的语言,更多的是一种更简单高效的C,因此在参数传递上跟C保持着基本的一致性。一些较大的数据类型,好比结构体、数组等,最好使用传递指针的方式,这样就能避免在函数传递时对数据的copy。对象
虽然slice在传递时是按照引用语义传递,可是又由于append()操做的问题,致使即便是引用传递仍是不能顺利解决一些问题,后面一篇文章将说明一下如何解决递归函数中传递slice的问题:blog