我发现自己对array
和slice
数据类型感到困惑。
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]
答案 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的指针。当您将一个数组复制到另一个数组或在函数中传递数组时,将复制或传递数组的整个副本。如果阵列尺寸较大,这将使操作成本更高。这样我们就可以切片了。