Go语言为什么很少使用数组原理解析

 更新时间:2023年12月25日 09:53:53   作者:frank  
这篇文章主要为大家介绍了Go语言为什么很少使用数组原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

数组介绍

在 Go 语言中,数组是一块连续的内存,数组不可以扩容,数组在作为参数传递时,属于值传递。

数组的长度和类型共同决定数组的类型,不同类型的数组之间不可以比较,否则在编译时会报错。

因为数组的一些特性,我们在 Go 项目开发中,很少使用数组。本文我们介绍一下数组的特性。

声明方式

在 Go 语言中,数组的声明方式有三种。

示例代码:

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)
}

输出结果:

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

阅读上面这段代码,我们使用三种方式声明数组,其中 arr1 和 arr2 的区别是,arr1 在声明时没有为数组赋值,所以输出结果是类型零值 [0 0]

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

数组的特性

在了解嘞数组的声明方式之后,我们再来介绍一下数组具有哪些特性。

数组的长度和类型共同决定数组的类型,例如 var arr1 [2]int 和 var arr2 [3]int 是不同的类型。并且不同类型的数组之间是不可以比较的,数组也不可以扩容。

如果数组长度小于等于 4 时,在编译时会对数组做内存优化,程序启动时在栈区初始化数组,我们在使用数组类型时,也可以注意一下这一点。

使用数组下标访问数组中的元素时,越界访问,在编译时会报错。但是,如果我们使用变量 arr[i] 作为数组下标访问数组中的元素,在编译时无法检查是否越界访问,在运行时会引发 panic

示例代码:

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

输出结果:

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

在作为参数传递数组类型的变量时,都属于值传递,我们在使用数组类型的参数时,要特别注意。

示例代码:

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)
}

输出结果:

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

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

总结

本文我们通过介绍 Go 语言中数组的一些特性,佐证数组在 Go 项目开发中很少使用的原因。

主要原因有两点,一是数组不可以扩容;二是值传递,大数组要特别小心,如果无法避免使用大数组,可以使用数组指针。

以上就是Go语言为什么很少使用数组原理解析的详细内容,更多关于Go语言数组使用的资料请关注脚本之家其它相关文章!

相关文章

  • 用Go语言标准库实现Web服务之项目介绍

    用Go语言标准库实现Web服务之项目介绍

    从本节开始将从后端到前端一步一步实现一个Go语言Web服务,后端除了MySQL驱动,全部使用Go语言标准库来实现一个小型项目,本篇将简单的介绍一下项目开发要准备的流程,感兴趣的同学可以阅读一下
    2023-05-05
  • go语言中数据接口set集合的实现

    go语言中数据接口set集合的实现

    set集合是一种常见的数据结构,它代表了一个唯一元素的集合,本文主要介绍了set的基本特性,包括唯一性、无序性、可变性和集合运算,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • go语言心跳超时的实现示例

    go语言心跳超时的实现示例

    本文主要介绍了go语言心跳超时的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Golang 使用gorm添加数据库排他锁,for update

    Golang 使用gorm添加数据库排他锁,for update

    这篇文章主要介绍了Golang 使用gorm添加数据库排他锁,for update,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang必知必会之Go Mod命令详解

    Golang必知必会之Go Mod命令详解

    go mod可以使项目从GOPATH的强制依赖中独立出来,也就是说你的项目依赖不再需要放在在GOPATH下面了,下面这篇文章主要给大家介绍了关于Golang必知必会之Go Mod命令的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Go语言简介和环境配置

    Go语言简介和环境配置

    Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发速度和易维护性,有人形容Go语言:Go= C + Python , 说明Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发,这篇文章主要介绍了Go介绍和环境配置,需要的朋友可以参考下
    2022-07-07
  • 3个Go语言中实用重构技术分享

    3个Go语言中实用重构技术分享

    代码重构是在不改变外部功能的情况下对现有代码进行改进,是编程的核心部分之一,本文为大家介绍了Go语言中3个实用重构技术,需要的可以参考一下
    2023-06-06
  • 解决panic: assignment to entry in nil map问题

    解决panic: assignment to entry in nil

    这篇文章主要介绍了解决panic: assignment to entry in nil map问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2008-01-01
  • golang 检查网络状态是否正常的方法

    golang 检查网络状态是否正常的方法

    今天小编就为大家分享一篇golang 检查网络状态是否正常的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • go zero微服务实战系服务拆分

    go zero微服务实战系服务拆分

    这篇文章主要为大家介绍了go zero微服务实战系服务拆分的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论