数组和切片数据类型

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

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

在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]


繁花如伊
浏览 240回答 3
3回答

慕村225694

请参阅“切片:用法和内部原理”var av = []int{1,5,2,3,7}那是一个切片,而不是数组。切片字面量的声明与数组字面量的声明一样,只是您省略了元素计数。这就解释了为什么sort函数将修改切片所引用内容的内容。正如Kirk在下面所评论的那样,sort.Ints 如果将数组而不是切片传递给它,则会给您一个错误。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([5] int)作为[] int类型作为sort.Ints期望接收slice [] int。

慕森卡

[]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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go