我发现自己对array和slice数据类型感到困惑。从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]
3 回答
慕村225694
TA贡献1880条经验 获得超4个赞
请参阅“切片:用法和内部原理”
var av = []int{1,5,2,3,7}
那是一个切片,而不是数组。
切片字面量的声明与数组字面量的声明一样,只是您省略了元素计数。
这就解释了为什么sort函数将修改切片所引用内容的内容。
正如Kirk在下面所评论的那样,sort.Ints
如果将数组而不是切片传递给它,则会给您一个错误。
func Ints(a []int)
慕标琳琳
TA贡献1830条经验 获得超9个赞
因为您使用的是切片,而不是数组。
这是一个切片:
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。
慕森卡
TA贡献1806条经验 获得超8个赞
[]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 回答
- 0 关注
- 237 浏览
添加回答
举报
0/150
提交
取消