在Go语言中,[:] 语法和数组赋值有何区别?

4

我正在学习GoLang教程,有以下疑问:

arr1:=[...]int{1,2,3}
arr2:=arr1
arr1[1]=99
fmt.Println(arr1)
fmt.Println(arr2)

它输出以下语句:

[1 99 3]
[1 2 3]

仅修改数组a,这是有道理的,因为数组被视为值。

如果我尝试以下操作,会让事情变得混乱

a:=[...]int{1,2,3}
b:=a[:]
a[1]=88
fmt.Println(a)
fmt.Println(b)

这将导致打印

[1 88 3]
[1 88 3]

问题: 这是否意味着说 b:=a 创建一个数组的副本,而说 b:=a[:] 会创建一个指向底层数组(在这种情况下是'a')的切片?


9
好的,以下是翻译内容:标题:Go语言切片介绍Go语言的切片(Slices)是一种强大且常用的数据结构,它允许您动态地增加或减少元素的数量。本文将介绍切片的基础知识、使用方式以及它们在Go中的作用。概述在Go语言中,切片是内置类型之一,与数组相关。但是,相比于数组,切片具有更多的功能和灵活性。切片可以被视为一个指向底层数组的窗口,通过调整窗口的大小,我们可以改变切片的长度和容量。由于切片不需要预先定义其大小,因此它们非常适合处理动态数量的数据。创建切片要创建一个切片,可以使用make函数,该函数需要传入两个参数:切片类型和切片长度。切片长度表示切片的初始大小,但是它可以随着时间的推移而增长或缩小。例如,以下代码段创建了一个名为numbers的切片,并将其初始化为长度为0,容量为10:numbers := make([]int, 0, 10)添加和删除元素可以使用内置的append函数向切片添加元素。如果切片没有足够的容量来存储新元素,则底层数组将自动扩展。例如,以下代码段向名为numbers的切片中添加了三个元素:numbers := []int{1, 2, 3} numbers = append(numbers, 4, 5, 6)同样地,可以使用内置的copy函数从一个切片复制元素到另一个切片。需要注意的是,如果目标切片长度不足,将只复制目标切片长度范围内的元素。删除切片中的元素通常可以通过将要删除的元素“覆盖”为止。我们也可以使用append和切片操作符“…”来删除多个元素。例如,以下代码段删除了numbers中的第二个元素:numbers := []int{1, 2, 3, 4, 5} numbers = append(numbers[:1], numbers[2:]...)切片与数组的比较在Go语言中,切片与数组有相似之处,但也存在一些重要的区别。数组的长度是固定的且不能更改,而切片的长度和容量都可以根据需要进行调整。另外,切片是一个引用类型,而数组则是一个值类型。这意味着当您将一个切片分配给另一个变量时,它们将共享底层数组。结论切片是Go语言中非常有用和强大的数据结构,它们允许动态增加或减少元素的数量,并提供了许多有用的函数来操作它们。在编写Go程序时,切片通常比数组更方便和实用。 - Nishant Dixit
1个回答

11
切片不会复制切片的数据。它创建一个指向原始数组的新切片值。这使得切片操作像操作数组索引一样高效。因此,修改重新切片的元素(而不是切片本身)会修改原始切片的元素。

https://blog.golang.org/slices-intro

请查看上面的链接,了解Slice背后的内部结构


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接