Go语言当中数组和切片的区别是什么?

发布于 1周前 作者 nodeper 最后一次编辑是 5天前 来自 问答

Go语言当中数组和切片的区别是什么?

Go语言中的数组:

数组固定长度。数组长度是数组类型的一部分,所以[3]int 和[4]int 是两种不 同的数组类型数组需要指定大小,不指定也会根据初始化, 自动推算出大小, 大小不可改变。数组是通过值传递的

Go语言中的切片:

切片可以改变长度。切片是轻量级的数据结构,三个属性,指针,长度,容量 不需要指定大小切片是地址传递(引用传递)可以通过数组来初始化,也可以 通过内置函数 make()来初始化,初始化的时候 len=cap,然后进行扩容。

1 回复

在Go语言中,数组(Array)和切片(Slice)是两种用于存储相同类型元素的集合,但它们之间存在几个关键的区别。

数组(Array)

  • 数组具有固定的长度,一旦创建,其长度不能改变。
  • 数组在Go中是值类型,这意味着当数组作为参数传递给函数时,传递的是数组的副本。
  • 数组可以通过索引访问其元素,索引从0开始。

示例代码

package main

import "fmt"

func main() {
    var arr [5]int // 声明一个长度为5的整型数组
    arr[0] = 1     // 初始化第一个元素
    fmt.Println(arr) // 输出: [1 0 0 0 0]
}

切片(Slice)

  • 切片是对数组的抽象,提供了一种灵活的方式来处理数组中的元素序列。
  • 切片的长度是可变的,可以通过内置函数append增加切片的长度。
  • 切片是引用类型,这意味着当切片作为参数传递给函数时,传递的是对原始数组的引用,而不是数组的副本。
  • 切片可以重新切片,这意味着可以创建共享相同底层数组的新的切片实例。

示例代码

package main

import "fmt"

func main() {
    arr := [5]int{1, 2, 3, 4, 5} // 声明并初始化一个数组
    slice := arr[1:4]            // 从数组arr中创建一个切片slice,包含索引1到3的元素
    fmt.Println(slice)           // 输出: [2 3 4]

    slice = append(slice, 6)     // 向切片追加一个元素
    fmt.Println(slice)           // 输出: [2 3 4 6]
    // 注意:原始数组arr不会被append操作改变
    fmt.Println(arr)             // 输出: [1 2 3 4 5]
}

总结

  • 长度:数组长度固定,切片长度可变。
  • 类型:数组是值类型,切片是引用类型。
  • 内存分配:数组在声明时分配内存,切片根据需要动态分配内存。
  • 操作:切片提供了更灵活的操作,如追加元素、重新切片等,而数组则较为固定。
回到顶部