为了账号安全,请及时绑定邮箱和手机立即绑定

数组和切片数据类型

数组和切片数据类型

Go
繁花如伊 2021-04-26 09:57:56
我发现自己对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)


查看完整回答
反对 回复 2021-05-17
?
慕标琳琳

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


查看完整回答
反对 回复 2021-05-17
?
慕森卡

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)


查看完整回答
反对 回复 2021-05-17
  • 3 回答
  • 0 关注
  • 237 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信