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语言数组使用的资料请关注脚本之家其它相关文章!

相关文章

  • Golang两行代码实现发送钉钉机器人消息

    Golang两行代码实现发送钉钉机器人消息

    创建一个钉钉机器人必须使用加签,本文通过Golang两行代码实现发送钉钉机器人消息,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • go语言LeetCode题解720词典中最长的单词

    go语言LeetCode题解720词典中最长的单词

    这篇文章主要为大家介绍了go语言LeetCode题解720词典中最长的单词,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • go mock server的简易实现示例

    go mock server的简易实现示例

    这篇文章主要为大家介绍了go mock server的简易实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • golang优先级队列的实现全过程

    golang优先级队列的实现全过程

    优先级队列是一种特殊队列,下面这篇文章主要给大家介绍了关于golang优先级队列的实现全过程,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Go语言普通指针unsafe.Pointer uintpt之间的关系及指针运算

    Go语言普通指针unsafe.Pointer uintpt之间的关系及指针运算

    这篇文章主要为大家介绍了Go语言普通指针unsafe.Pointer uintpt之间的关系及指针运算示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go语言中排序的3种实现方法

    Go语言中排序的3种实现方法

    在写代码过程中,排序是经常会遇到的需求,这篇文章主要为大家介绍三种常用的方法,文中的示例代码简洁易懂,需要的小伙伴可以参考下
    2023-08-08
  • 图文详解Go中的channel

    图文详解Go中的channel

    Channel是go语言内置的一个非常重要的特性,也是go并发编程的两大基石之一,下面这篇文章主要给大家介绍了关于Go中channel的相关资料,需要的朋友可以参考下
    2023-02-02
  • Golang 获取系统信息的实现

    Golang 获取系统信息的实现

    本文主要介绍了Golang 获取系统信息的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 深入了解Golang为什么需要超时控制

    深入了解Golang为什么需要超时控制

    本文将介绍为什么需要超时控制,然后详细介绍Go语言中实现超时控制的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-05-05
  • Golang编程并发工具库MapReduce使用实践

    Golang编程并发工具库MapReduce使用实践

    这篇文章主要为大家介绍了Golang并发工具库MapReduce的使用实践,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04

最新评论