Go 语言为什么很少使用数组?
2023/12/31 18:32:20
本文主要是介绍Go 语言为什么很少使用数组?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
大家好,我是 frank,「Golang 语言开发栈」公众号作者。
01 介绍
在 Go 语言中,数组是一块连续的内存,数组不可以扩容,数组在作为参数传递时,属于值传递。
数组的长度和类型共同决定数组的类型,不同类型的数组之间不可以比较,否则在编译时会报错。
因为数组的一些特性,我们在 Go 项目开发中,很少使用数组。本文我们介绍一下数组的特性。
02 数组
声明方式
在 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]
阅读上面这段代码,我们可以发现数组在作为参数传递时,地址发生变化,可以证明其属于值传递,即分配一块新内存,将数组的值拷贝到新内存。
03 总结
本文我们通过介绍 Go 语言中数组的一些特性,佐证数组在 Go 项目开发中很少使用的原因。
主要原因有两点,一是数组不可以扩容;二是值传递,大数组要特别小心,如果无法避免使用大数组,可以使用数组指针。
这篇关于Go 语言为什么很少使用数组?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站