去lang数组和切片数据types

我是Go语言的新手。 我发现自己与arrayslice数据types混淆。

从Go文档中,数组描述如下:

Go和C中数组的工作方式有很大的不同。在Go中,

  • 数组是值。 将一个数组分配给另一个数组复制所有元素。
  • 尤其是,如果将一个数组传递给一个函数,它将会收到一个数组的副本,而不是指向它的指针。
  • 数组的大小是其types的一部分。 types[10] int和[20] int是不同的。

function:

和C系列中的所有语言一样,Go中的所有东西都是有价值的。 也就是说,一个函数总是获得被传递的东西的副本,就像有一个赋值语句赋值给参数一样。 例如,将一个int值传递给一个函数会生成一个int的副本,并且传递一个指针值会创build指针的副本,但不会指向它所指向的数据。

为什么sort.Ints(arrayValue)修改传递的variables时,我宣布它作为一个数组,而不是一个切片?

 var av = []int{1,5,2,3,7} fmt.Println(av) sort.Ints(av) fmt.Println(av) return 

产量

 [1 5 2 3 7] [1 2 3 5 7] 

请参阅“ 切片:使用和内部 ”

 var av = []int{1,5,2,3,7} 

这是一个切片,而不是一个数组。

切片文字被声明为一个数组文字,除了省略元素数。

这就解释了为什么sortingfunction会修改切片引用的内容

正如Kirk sort.Intssort.Ints会给你一个错误,如果你传递一个数组而不是一个slice。

 func Ints(a []int) 

因为你正在使用一个切片,而不是一个数组。

这是一个切片:

 var av = []int{1,5,2,3,7} 

那些是数组:

 var av = [...]int{1,5,2,3,7} var bv = [5]int{1,5,2,3,7} 

如果你尝试编译:

 var av = [...]int{1,5,2,3,7} fmt.Println(av) sort.Ints(av) fmt.Println(av) 

,你会得到一个错误:

在函数参数中不能使用av(type [5] int)作为type [] int

作为sort.Ints期望收到一个切片[] INT 。

[]int{1,5,2,3,7}不是一个数组。 一个数组有它的长度,如[5]int{1,5,2,3,7}

制作切片的副本并对其进行sorting:

 a := []int{1,5,2,3,7} sortedA := make([]int, len(a)) copy(sortedA, a) sort.Ints(sortedA) fmt.Println(a) fmt.Println(sortedA) 
 var av = []int{1,5,2,3,7} 

在上面的语句中,你正在像一个数组初始化切片

创build一个数组的语法应该是

 var av = [5]int{1,5,2,3,7}