首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组和切片数据类型

数组和切片数据类型
EN

Stack Overflow用户
提问于 2012-07-31 09:29:19
回答 5查看 33.2K关注 0票数 57

我发现自己被arrayslice数据类型搞混了。

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

数组在Go中的工作方式与C在Go中的工作方式有很大的不同,

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

功能:

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

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

代码

代码语言:javascript
复制
var av = []int{1,5,2,3,7}

fmt.Println(av)
sort.Ints(av)
fmt.Println(av)
return

输出

代码语言:javascript
复制
[1 5 2 3 7]
[1 2 3 5 7]
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-31 09:39:17

见"切片:使用和内部

代码语言:javascript
复制
var av = []int{1,5,2,3,7}

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

片文字的声明与数组文本一样,只是省略了元素计数。

这解释了为什么排序函数将修改片引用的内容。

正如下面柯克注释的那样,如果您传递一个数组而不是一个片,sort.Ints会给出一个错误。

代码语言:javascript
复制
func Ints(a []int)
票数 55
EN

Stack Overflow用户

发布于 2012-07-31 09:38:47

因为你用的是切片而不是数组。

这是一片:

代码语言:javascript
复制
var av = []int{1,5,2,3,7}

这些是数组:

代码语言:javascript
复制
var av = [...]int{1,5,2,3,7}
var bv = [5]int{1,5,2,3,7}

如果您试图编译:

代码语言:javascript
复制
var av = [...]int{1,5,2,3,7}
fmt.Println(av)
sort.Ints(av)
fmt.Println(av)

,您将得到一个错误:

不能在函数参数中使用av (类型5int)作为类型[]int

因为sort.Ints希望收到一个片[]int

票数 54
EN

Stack Overflow用户

发布于 2012-07-31 09:47:25

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

制作切片的副本并对其进行排序:

代码语言:javascript
复制
a := []int{1,5,2,3,7}
sortedA := make([]int, len(a))
copy(sortedA, a)
sort.Ints(sortedA)
fmt.Println(a)
fmt.Println(sortedA)
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11737053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档