学无先后,达者为师

网站首页 编程语言 正文

Go 数组与切片的区别

作者:GeeCode 更新时间: 2023-07-09 编程语言

在 Go 语言中,数组和切片都是用于存储一组相同类型的元素,但它们在内部结构、长度和使用方式上有很大的区别。

数组

在 Go 语言中,数组是一组固定长度的元素的集合。数组的长度是在创建数组时指定的,且不能更改。数组中的元素类型必须相同,可以是任何基本类型或结构体类型。

下面是一个示例代码,演示了如何创建和使用数组:

package main

import "fmt"

func main() {
    // 创建一个长度为 3 的整型数组
    var arr [3]int

    // 设置数组元素的值
    arr[0] = 1
    arr[1] = 2
    arr[2] = 3

    // 打印数组
    fmt.Println(arr) // 输出:[1 2 3]
}

在上面的代码中,我们创建了一个长度为 3 的整型数组 arr,并为其设置了元素的值。我们可以使用数组下标访问数组中的元素,并使用 fmt.Println 函数打印整个数组。

切片

在 Go 语言中,切片是一个动态长度的序列,可以通过对底层数组的引用来实现。切片可以用于存储任何类型的元素,且可以动态扩展和收缩。

下面是一个示例代码,演示了如何创建和使用切片:

package main

import "fmt"

func main() {
    // 创建一个长度为 3 的整型数组
    arr := [3]int{1, 2, 3}

    // 创建一个长度为 2 的整型切片,引用数组的前两个元素
    slice := arr[:2]

    // 打印切片和底层数组
    fmt.Println(slice) // 输出:[1 2]
    fmt.Println(arr)   // 输出:[1 2 3]
}

在上面的代码中,我们创建了一个长度为 3 的整型数组 arr,并使用数组的前两个元素创建了一个长度为 2 的整型切片 slice。我们可以使用 : 操作符来创建一个切片,其中左侧的下标表示切片的起始位置,右侧的下标表示切片的结束位置(不包括该位置)。如果左侧的下标省略,则默认为 0;如果右侧的下标省略,则默认为数组的长度。我们可以使用 fmt.Println 函数打印切片和底层数组。

区别

数组和切片在 Go 语言中有很大的区别,主要体现在以下几个方面:

内部结构

数组在内存中是一段连续的内存空间,元素的类型和长度都是固定的。切片在内存中由一个指向底层数组的指针、长度和容量组成,长度表示切片当前包含的元素个数,容量表示切片可以扩展的最大元素个数。

长度

数组的长度在创建时指定,不能更改。切片的长度可以动态扩展或收缩,可以根据需要自由调整。

使用方式

数组在使用时需要明确指定下标访问元素,不能动态生成。切片可以使用 append 函数向其末尾添加元素,可以使用 copy 函数复制切片,也可以使用 make 函数创建指定长度和容量的切片。

示例代码

下面是一个完整的示例代码,演示了 Go 语言中数组和切片的区别:

package main

import "fmt"

func main() {
    // 创建一个长度为 3 的整型数组
    var arr [3]int

    // 设置数组元素的值
    arr[0] = 1
    arr[1] = 2
    arr[2] = 3

    // 创建一个长度为 2 的整型切片,引用数组的前两个元素
    slice := arr[:2]

    // 向切片末尾添加一个元素
    slice = append(slice, 4)

    // 打印数组和切片
    fmt.Println(arr)   // 输出:[1 2 3]
    fmt.Println(slice) // 输出:[1 2 4]

    // 复制切片
    slice2 := make([]int, len(slice))
    copy(slice2, slice)

    // 打印切片和复制后的切片
    fmt.Println(slice)  // 输出:[1 2 4]
    fmt.Println(slice2) // 输出:[1 2 4]
}

在上面的代码中,我们创建了一个长度为 3 的整型数组 arr,并使用数组的前两个元素创建了一个长度为 2 的整型切片 slice。我们向切片末尾添加了一个元素,并使用 fmt.Println 函数打印了数组和切片。接着,我们使用 make 函数创建了一个长度和 slice 相同的空切片 slice2,并使用 copy 函数将 slice 的元素复制到 slice2 中。最后,我们使用 fmt.Println 函数打印了 sliceslice2

总结

在 Go 语言中,数组和切片都是用于存储一组相同类型的元素,但它们在内部结构、长度和使用方式上有很大的区别。数组是一组固定长度的元素的集合,长度在创建时指定,不能更改,使用时需要明确指定下标访问元素。切片是一个动态长度的序列,长度可以动态扩展或收缩,使用时可以动态生成、复制或添加元素。希望本文对您理解 Go 语言中数组和切片的区别有所帮助。

原文链接:https://blog.csdn.net/GeeCode/article/details/131465820

  • 上一篇:没有了
  • 下一篇:没有了
栏目分类
最近更新