
在go语言中,数组(array)和切片(slice)是两种常用的复合数据类型,它们在内存管理和行为上有着本质的区别。理解这两种类型的工作原理对于编写高效且正确的go程序至关重要,尤其是在涉及数据传递和修改时。
数组是Go语言中一种固定长度的、同类型元素的集合。数组的长度在声明时确定,并且是其类型的一部分。这意味着[3]int和[4]int是两种不同的类型。
核心特性:
声明和初始化示例:
// 声明一个包含3个整数的数组,并初始化
arr1 := [3]int{1, 2, 3}
// 声明一个数组,让编译器根据初始化值推断其长度
arr2 := [...]int{1, 2, 3} // 等同于 [3]int{1, 2, 3}
// 声明一个包含3个整数的数组,元素将被初始化为零值(int的零值是0)
var arr3 [3]int如果执行以下操作:
立即学习“go语言免费学习笔记(深入)”;
a := [3]int{1, 2, 3}
b := a // b是a的一个完整副本
b[0] = 99
fmt.Println(a) // 输出: [1 2 3]
fmt.Println(b) // 输出: [99 2 3]可以看到,对b的修改不会影响a。
切片是Go语言中一种更常用、更灵活的动态长度序列。切片是对底层数组的一个引用,它包含三个组件:指向底层数组的指针、切片的长度(length)和切片的容量(capacity)。
核心特性:
声明和初始化示例:
// 声明一个切片,并初始化,Go会自动创建一个匿名的底层数组
slice1 := []int{1, 2, 3} // 这是一个切片,不是数组
// 使用make函数创建一个切片,指定长度和容量(容量可选)
slice2 := make([]int, 3) // 创建一个长度为3的切片,所有元素为零值
slice3 := make([]int, 3, 5) // 创建一个长度为3,容量为5的切片,所有元素为零值如果执行以下操作:
立即学习“go语言免费学习笔记(深入)”;
s1 := []int{1, 2, 3}
s2 := s1 // s2和s1现在引用同一个底层数组
s2[0] = 99
fmt.Println(s1) // 输出: [99 2 3]
fmt.Println(s2) // 输出: [99 2 3]可以看到,对s2的修改会影响s1,因为它们共享同一个底层数组。
现在,让我们分析原始问题中提供的代码,以理解其行为:
package main
import (
"fmt"
"math/rand" // 注意:原代码使用"rand",但Go 1.0后推荐使用"math/rand"
"time"
)
func shuffle(arr []int) { // arr 是一个切片
// 推荐使用 time.Now().UnixNano() 作为种子
// rand.Seed() 在 Go 1.20+ 版本中已弃用,建议使用 rand.NewSource 和 rand.New
rand.Seed(time.Now().UnixNano())
for i := len(arr) - 1; i > 0; i-- {
j := rand.Intn(i + 1) // rand.Intn(n) 返回 [0, n)
arr[i], arr[j] = arr[j], arr[i]
}
}
func main() {
arr := []int{1, 2, 3, 4, 5} // 声明并初始化一个切片
arr2 := arr // 将切片 arr 赋值给 arr2。此时,arr 和 arr2 共享同一个底层数组。
shuffle(arr) // 调用 shuffle 函数,传入 arr。
// shuffle 函数接收到的是 arr 切片头的一个副本,
// 但这个副本仍然指向 arr 所引用的那个底层数组。
for _, i := range arr2 {
fmt.Printf("%d ", i)
}
fmt.Println() // 打印换行
}行为解释:
这就是为什么arr2会被打乱的原因:arr和arr2并非独立的数组,它们是共享同一底层数据的两个切片引用。
通过深入理解数组和切片这两种数据结构的特性,开发者可以更好地利用Go语言的强大功能,避免常见的编程陷阱,并编写出更加健壮和高效的代码。
以上就是Go语言中数组与切片的区别及引用行为解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号