数组和切片数据类型

时间:2012-07-31 09:29:19

标签: arrays go slice pass-by-value func

我发现自己对arrayslice数据类型感到困惑。

From Go docs,数组描述如下:

  

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

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

功能:

  

与C系列中的所有语言一样,Go中的所有内容都通过   值。也就是说,一个函数总是得到一个东西的副本   传递,好像有一个赋值的赋值语句   到参数。例如,将int值传递给函数   制作int的副本,并传递指针值制作副本   指针,但不指向它指向的数据。

为什么sort.Ints(arrayValue)在我将其声明为数组而不是切片时会修改传递的变量?

代码

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]

5 个答案:

答案 0 :(得分:43)

因为您使用的是切片,而不是数组。

这是一个片段:

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)作为类型[] int

as sort.Ints希望收到slice []int

答案 1 :(得分:39)

请参阅“Slices: usage and internals

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

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

  

切片文字声明就像数组文字一样,除了省略元素数。

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

如下面Kirk所述,sort.Ints如果您传递数组而不是切片,则会给您一个错误。

func Ints(a []int)

答案 2 :(得分:11)

[]int{1,5,2,3,7}不是数组。数组的长度类型为[5]int{1,5,2,3,7}

制作切片的副本并改为排序:

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

答案 3 :(得分:3)

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

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

要创建数组,语法应为

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

答案 4 :(得分:0)

切片是指向array的指针。当您将一个数组复制到另一个数组或在函数中传递数组时,将复制或传递数组的整个副本。如果阵列尺寸较大,这将使操作成本更高。这样我们就可以切片了。