去lang数组和切片数据类型

dug*_*ets 48 arrays func pass-by-value go slice

我是Go语言的新手.我发现自己arrayslice数据类型混淆了.

从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
Run Code Online (Sandbox Code Playgroud)

产量

[1 5 2 3 7]
[1 2 3 5 7]
Run Code Online (Sandbox Code Playgroud)

Art*_*tov 44

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

这是一个片段:

var av = []int{1,5,2,3,7}
Run Code Online (Sandbox Code Playgroud)

这些是阵列:

var av = [...]int{1,5,2,3,7}
var bv = [5]int{1,5,2,3,7}
Run Code Online (Sandbox Code Playgroud)

如果你尝试编译:

var av = [...]int{1,5,2,3,7}
fmt.Println(av)
sort.Ints(av)
fmt.Println(av)
Run Code Online (Sandbox Code Playgroud)

,你会收到一个错误:

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

as sort.Ints期望收到一个slice [] int.

  • 是的,切片由指向数组元素和长度的指针组成.所以它是对数组的子部分的引用(如果你愿意的话,是数组的'slice'). (13认同)
  • 那么,切片就像数组的“引用”? (2认同)

Von*_*onC 41

请参阅" 切片:用法和内部 "

var av = []int{1,5,2,3,7}
Run Code Online (Sandbox Code Playgroud)

这是一个切片,而不是一个数组.

除了遗漏元素计数之外,slice文字声明就像数组文字一样.

这就解释了为什么sort函数将修改切片引用的内容.

正如Kirk在下面评论的那样,sort.Ints 如果你传递一个数组而不是一个切片,会给你一个错误.

func Ints(a []int)
Run Code Online (Sandbox Code Playgroud)

  • 另外,如果将数组而不是切片传递给sort.Ints,则会给您一个错误。sort.Ints文档指定一个切片。https://golang.org/pkg/sort/#Ints (3认同)

Mos*_*vah 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)
Run Code Online (Sandbox Code Playgroud)

  • 它也可能有...而不是它的长度.[...] INT {1,2,3} (4认同)

小智 5

切片是指向数组的指针。当您将一个数组复制到另一个数组或在函数中传递数组时,数组的整个副本都会被复制或传递。如果数组大小很大,这会导致操作成本更高。所以我们可以去吃切片。