我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Go语言数组和切片的区别详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Go语言数组和切片的区别详解

在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。

另外,这个问题在面试中也经常会被问到,属于入门级题目,看过文章之后,相信你会有一个很好的答案。

数组

数组是同一种数据类型元素的集合,数组在定义时需要指定长度和元素类型。

例如:[4]int 表示一个包含四个整数的数组,数组的大小是固定的。并且长度是其类型的一部分([4]int[5]int 是不同的、不兼容的类型)。

数组元素可以通过索引来访问,比如表达式 s[n] 表示访问第 n 个元素,索引从零开始。

声明以及初始化

func main() {
    var nums [3]int   // 声明并初始化为默认零值
    var nums1 = [4]int{1, 2, 3, 4}  // 声明同时初始化
    var nums2 = [...]int{1, 2, 3, 4, 5} // ...可以表示后面初始化值的长度
    fmt.Println(nums)    // [0 0 0]
    fmt.Println(nums1)   // [1 2 3 4]
    fmt.Println(nums2)   // [1 2 3 4 5]
}

函数参数

如果数组作为函数的参数,那么实际传递的是一份数组的拷贝,而不是数组的指针。这也就意味着,在函数中修改数组的元素是不会影响到原始数组的。

package main

import (
    "fmt"
)

func Add(numbers [5]int) {
    for i := 0; i < len(numbers); i++ {
        numbers[i] = numbers[i] + 1
    }
    fmt.Println("numbers in Add:", numbers) // [2 3 4 5 6]
}

func main() {
    // declare and initialize the array
    var numbers [5]int
    for i := 0; i < len(numbers); i++ {
        numbers[i] = i + 1
    }

    Add(numbers)
    fmt.Println("numbers in main:", numbers) // [1 2 3 4 5]
}

切片

数组的使用场景相对有限,切片才更加常用。

切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。

切片是一种引用类型,它有三个属性:指针长度容量

  • 指针:指向 slice 可以访问到的第一个元素。
  • 长度:slice 中元素个数。
  • 容量:slice 起始元素到底层数组最后一个元素间的元素个数。

底层源码定义如下:

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

声明以及初始化

func main() {
    var nums []int  // 声明切片
    fmt.Println(len(nums), cap(nums)) // 0 0
    nums = append(nums, 1)   // 初始化
    fmt.Println(len(nums), cap(nums)) // 1 1

    nums1 := []int{1,2,3,4}    // 声明并初始化
    fmt.Println(len(nums1), cap(nums1))    // 4 4

    nums2 := make([]int,3,5)   // 使用make()函数构造切片
    fmt.Println(len(nums2), cap(nums2))    // 3 5
}

函数参数

当切片作为函数参数时,和数组是不同的,如果一个函数接受一个切片参数,它对切片元素所做的更改将对调用者可见,类似于将指针传递给了底层数组。

package main

import (
    "fmt"
)

func Add(numbers []int) {
    for i := 0; i < len(numbers); i++ {
        numbers[i] = numbers[i] + 1
    }
    fmt.Println("numbers in Add:", numbers) // [2 3 4 5 6]
}

func main() {
    var numbers []int
    for i := 0; i < 5; i++ {
        numbers = append(numbers, i+1)
    }

    Add(numbers)

    fmt.Println("numbers in main:", numbers) // [2 3 4 5 6]
}

再看一下上面的例子,把参数由数组变成切片,Add 函数中的修改会影响到 main 函数。

总结

最后来总结一下,面试时也可以这么来回答:

  • 数组是一个长度固定的数据类型,其长度在定义时就已经确定,不能动态改变;切片是一个长度可变的数据类型,其长度在定义时可以为空,也可以指定一个初始长度。
  • 数组的内存空间是在定义时分配的,其大小是固定的;切片的内存空间是在运行时动态分配的,其大小是可变的。
  • 当数组作为函数参数时,函数操作的是数组的一个副本,不会影响原始数组;当切片作为函数参数时,函数操作的是切片的引用,会影响原始切片。
  • 切片还有容量的概念,它指的是分配的内存空间。

以上就是本文的全部内容,如果觉得还不错的话欢迎点赞转发关注,感谢支持。

参考文章:

  • https://go.dev/doc/effective_go#arrays
  • https://go.dev/blog/slices-intro
  • https://levelup.gitconnected.com/go-programming-array-vs-slice-5902b7fdd436

 到此这篇关于Go 语言数组和切片的区别详解的文章就介绍到这了,更多相关Go 数组和切片内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Go语言数组和切片的区别详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go语言数组和切片的区别详解

本文主要介绍了Go语言数组和切片的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-14

Go语言数组和切片的区别有哪些

这篇“Go语言数组和切片的区别有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言数组和切片的区别有哪些”文章吧。数
2023-07-05

深入剖析Go语言中数组和切片的区别

本文将深入探讨Go语言数组和切片的区别,包括它们的定义、内存布局、长度和容量、初始化和操作等方面。从而更好地在实际开发中选择和使用合适的数据结构,提高代码的效率和可维护性,需要的可以参考一下
2023-05-19

go语言中数组与切片有哪些区别

本文小编为大家详细介绍“go语言中数组与切片有哪些区别”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言中数组与切片有哪些区别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。数组与切片的区别:1、切片是指针类
2023-07-05

Go中的nil切片和空切片区别详解

Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 布尔型变量默认为false。 切片、函数、指针变量的默认为nil
2022-06-07

GO语言的数组array与切片slice详解

这篇文章主要介绍了GO语言的数组array与切片slice,包括了GO语言数组定义赋值,GO语言多维数组,GO语言切片等知识点需要的朋友可以参考下
2022-12-19

go切片和数组有什么区别

Go语言中的数组和切片有以下区别:长度固定 vs 动态长度:数组的长度在声明时就确定了,无法改变;而切片的长度可以动态增长或缩小。内存分配方式:数组在声明时会分配固定大小的连续内存空间;而切片则是引用一个数组,通过指针指向底层数组,并记录切
go切片和数组有什么区别
2024-02-29

go语言切片和变量有什么区别

go语言切片和变量有:1、切片是一种引用类型,而变量是一种值类型;2、切片具有动态扩容的能力,而变量的大小是固定的;3、切片可以通过切片表达式来提取部分元素,而变量只能访问整个值;4、切片还可以与其他切片共享底层数据,而变量是独立的。本教程
2023-07-14

go语言中切片的长度和容量的区别

切片的长度,显而易见的就是元素的个数,根据元素的个数进行返回具体的长度。 切片的长度,更像是一个警戒值,如果长度与容量相等,就会进行容量的扩容,比如des :=make([]int , 3 , 5) //此时,长度为3,容量为5,但是如果使
2022-06-07

Go语言中的数组和切片是什么

本篇内容介绍了“Go语言中的数组和切片是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录1. 数组2. 切片(Slice)append
2023-06-20

go语言中切片和数组指的是什么

本文小编为大家详细介绍“go语言中切片和数组指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言中切片和数组指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在go语言中,数组是一个由固定长度
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录