dug*_*ets 48 arrays func pass-by-value go slice
我是Go语言的新手.我发现自己array
与slice
数据类型混淆了.
从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.
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)
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)