当前位置: 首页 > 知识库问答 >
问题:

数组和切片数据类型

厍晋鹏
2023-03-14

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

从Go docs中,数组描述如下:

Go中的数组工作方式与C中的数组工作方式有很大区别,

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

功能:

与C系列中的所有语言一样,Go中的所有内容都是通过值传递的。也就是说,函数总是获取所传递内容的副本,就像有一条赋值语句将值赋给参数一样。例如,向函数传递int值会生成int的副本,传递指针值会生成指针的副本,但不会生成指针指向的数据。

为什么排序。当我将传递的变量声明为数组而不是切片时,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个答案

戚建德
2023-03-14

[]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)
谯志诚
2023-03-14

因为您使用的是切片,而不是数组。

这是一个片段:

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)作为type[]int

像这样。Ints希望收到一个切片[]int。

姜钊
2023-03-14

请参见“切片:用法和内部”

var av = []int{1,5,2,3,7}

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

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

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

正如Kirk在下面所评论的,sort。如果向Ints传递的是数组而不是切片,则Ints将给您一个错误。

func Ints(a []int)

 类似资料:
  • 创建: arr1 := new([len]type) slice1 := make([]type, len) 初始化: arr1 := [...]type{i1, i2, i3, i4, i5} arrKeyValue := [len]type{i1: val1, i2: val2} var slice1 []type = arr1[start:end] (1)如何截断数组或者切片的最后一个元素:

  • 在主流的编程语言中数组及其相关的数据结构是使用得最为频繁的,只有在它(们)不能满足时才会考虑链表、hash表(hash表可以看作是数组和链表的混合体)和更复杂的自定义数据结构。 Go语言中数组、字符串和切片三者是密切相关的数据结构。这三种数据类型,在底层原始数据有着相同的内存结构,在上层,因为语法的限制而有着不同的行为表现。首先,Go语言的数组是一种值类型,虽然数组的元素可以被修改,但是数组本身的

  • 这章我们开始剖析 容器, 它是可以包含大量条目(item)的数据结构, 例如数组、切片和 map。从这看到 Go 明显受到 Python 的影响。 以 [] 符号标识的数组类型几乎在所有的编程语言中都是一个基本主力。Go 语言中的数组也是类似的,只是有一些特点。Go 没有 C 那么灵活,但是拥有切片(slice)类型。这是一种建立在 Go 语言数组类型之上的抽象,要想理解切片我们必须先理解数组。数

  • 在上面的章节里面,我们讲过Go内置的基本数据类型。现在我们来看一下Go内置的高级数据类型,数组,切片和字典。 数组(Array) 数组是一个具有相同数据类型的元素组成的固定长度的有序集合。比如下面的例子 var x [5]int 表示数组x是一个整型数组,而且数值的长度为5。 Go提供了几种不同的数组定义方法。 最基本的方式就是使用var关键字来定义,然后依次给元素赋值。对于没有赋值的元素,默认为

  • 问题内容: 我是Python和numpy的新手。我已经弄清楚如何对一维序列进行切片:,并访问数组中的元素:。 尝试类似(numpy数组在哪里)的操作不会给我前两行和一列,而是会重复前两行。我刚才做了什么,以及如何沿着另一个维度进行切片? 问题答案: 如果使用,这很容易: 或者如果您想要0, 您将得到相同的结果。 *请注意,这实际上是内置类型的名称。通常,我建议给您的对象一个不同的“名称”。 换句话

  • 问题内容: 我想有一个通用的方法,无论它是作为指针,切片还是数组提供的,都将始终返回结构值。 我对此的处理方式如下: 去游乐场 如您所见,问题出在从a 或。中获取结构。 我如何扩展上面的函数以从数组或切片中获取struct的值? 更新:我要做的就是将变成。 问题答案: 如果你只是想要的类型,即使片是零,你可以使用像这样: 关于,来自http://golang.org/pkg/reflect/#Ty