当前位置:首页 > 科技  > 软件

Go 语言为什么很少使用数组?

来源: 责编: 时间:2024-01-02 17:28:35 327观看
导读一、介绍在 Go 语言中,数组是一块连续的内存,数组不可以扩容,数组在作为参数传递时,属于值传递。数组的长度和类型共同决定数组的类型,不同类型的数组之间不可以比较,否则在编译时会报错。因为数组的一些特性,我们在 Go 项目

一、介绍

在 Go 语言中,数组是一块连续的内存,数组不可以扩容,数组在作为参数传递时,属于值传递。jf828资讯网——每日最新资讯28at.com

数组的长度和类型共同决定数组的类型,不同类型的数组之间不可以比较,否则在编译时会报错。jf828资讯网——每日最新资讯28at.com

因为数组的一些特性,我们在 Go 项目开发中,很少使用数组。本文我们介绍一下数组的特性。jf828资讯网——每日最新资讯28at.com

jf828资讯网——每日最新资讯28at.com

二、数组

1.声明方式

在 Go 语言中,数组的声明方式有三种。jf828资讯网——每日最新资讯28at.com

示例代码:jf828资讯网——每日最新资讯28at.com

func main() { var arr1 [2]int var arr2 = [2]int{1, 2} var arr3 = [...]int{1, 2} fmt.Println(arr1) fmt.Println(arr2) fmt.Println(arr3)}

输出结果:jf828资讯网——每日最新资讯28at.com

[0 0][1 2][1 2]

阅读上面这段代码,我们使用三种方式声明数组,其中 arr1 和 arr2 的区别是,arr1 在声明时没有为数组赋值,所以输出结果是类型零值 [0 0]。jf828资讯网——每日最新资讯28at.com

需要注意的是,arr3 没有指定数组的长度,而是使用 [...] 替代,这实际上是 Go 语言中声明数组的语法糖,编译时通过数组的赋值,自动推断数组的长度,我们可以使用内置函数 len() 查询数组的长度。jf828资讯网——每日最新资讯28at.com

2.数组的特性

在了解完数组的声明方式之后,我们再来介绍一下数组具有哪些特性。jf828资讯网——每日最新资讯28at.com

数组的长度和类型共同决定数组的类型,例如 var arr1 [2]int 和 var arr2 [3]int 是不同的类型。并且不同类型的数组之间是不可以比较的。因为数组的长度是指定的,所以数组也不可以扩容。jf828资讯网——每日最新资讯28at.com

如果数组长度小于等于 4 时,在编译时会对数组做内存优化,程序启动时在栈区初始化数组,我们在使用数组类型时,也可以注意一下这一点。jf828资讯网——每日最新资讯28at.com

使用数组下标访问数组中的元素时,越界访问,在编译时会报错。但是,如果我们使用变量 arr[i] 作为数组下标访问数组中的元素,在编译时无法检查是否越界访问,在运行时会引发 panic。jf828资讯网——每日最新资讯28at.com

示例代码:jf828资讯网——每日最新资讯28at.com

func Store() { var arr [2]int for i := 0; i < 5; i++ {  arr[i] = i + 1 } fmt.Println(arr)}

输出结果:jf828资讯网——每日最新资讯28at.com

panic: runtime error: index out of range [2] with length 2goroutine 1 [running]:...

在作为参数传递数组类型的变量时,属于值传递,我们在使用数组类型的参数时,要特别注意这一点。jf828资讯网——每日最新资讯28at.com

示例代码:jf828资讯网——每日最新资讯28at.com

func main() { var arr2 = [2]int{1, 2} Get(arr2) fmt.Printf("arr2=%p/n%d/n", &arr2, arr2)}func Get(arr [2]int) { fmt.Printf("Get()=%p/n%d/n", &arr, arr)}

输出结果:jf828资讯网——每日最新资讯28at.com

Get()=0xc0000120f0[1 2]arr2=0xc0000120b0[1 2]

阅读上面这段代码,我们可以发现数组在作为参数传递时,地址发生变化,可以证明其属于值传递,即分配一块新内存,将数组的值拷贝到新内存。jf828资讯网——每日最新资讯28at.com

三、总结

本文我们通过介绍 Go 语言中数组的一些特性,佐证数组在 Go 项目开发中很少使用的原因。jf828资讯网——每日最新资讯28at.com

主要原因有两点,一是数组不可以扩容;二是值传递,大数组要特别小心,如果无法避免使用大数组,可以使用数组指针。jf828资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-56426-0.htmlGo 语言为什么很少使用数组?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 在 Go 项目中封装 AES 加解密客户端接口

下一篇: 面试官:说说JVM内存整体结构?线程私有还是共享的?

标签:
  • 热门焦点
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1、前言在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 自研Exynos回归!三星Galaxy S24系列将提供Exynos和骁龙双版本

    年初,全新的三星Galaxy S23系列发布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三个版本,全系搭载超频版骁龙8 Gen 2,虽同样采用台积电4nm工艺制
  • Android 14发布:首批适配机型公布

    5月11日消息,谷歌在今天凌晨举行了I/O大会,本次发布会谷歌带来了自家的AI语言模型PaLM 2、谷歌Pixel Fold折叠屏、谷歌Pixel 7a手机,同时发布了Androi
  • 三翼鸟智能家居亮相电博会,让用户体验更真实

    2021电博会在青岛国际会展中心开幕中,三翼鸟直接把“家”搬到了现场,成为了展会的一大看点。这也是三翼鸟继9月9日发布了行业首个一站式定制智慧家平台后的
Top