首页 > 其他分享 >Go 语言为什么很少使用数组?

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

时间:2023-12-31 15:23:21浏览次数:21  
标签:arr int 很少 var arr2 数组 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]

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

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

数组的特性

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

数组的长度和类型共同决定数组的类型,例如 var arr1 [2]intvar 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 项目开发中很少使用的原因。

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

标签:arr,int,很少,var,arr2,数组,Go
From: https://www.cnblogs.com/frank-/p/17937522

相关文章

  • Golang学习笔记(三)—— 常见控制结构
    Golang常见控制结构条件语句if语句*不支持三目运算符*可省略条件表达式括号*代码块左括号必须在条件表达式尾部*else或elseif必须和上一代码块右括号同一行if条件表达式1{...}elseif条件表达式2{...}else{...}if语法 ......
  • django练手系列(五):优化basic.html的功能,增加其它网页引入模板网页后可以变动的部分
    一.折叠basic.html关于导航部分的代码,折叠后如图:二.增加网页可变动部分的方法:增加可变动部分的方法是:在html文件的合适位置插入代码块{%block位置名称%}{%endblock%}引用模板的网页只需要在变动部分写入同样的代码块,即可插入可变动部分。三.增加网页可变动部分......
  • java的二维数组怎么添加数据
    Java的二维数组怎么添加数据在Java中,二维数组是由多个一维数组组成的,可以看作是一个表格或者矩阵。要向二维数组中添加数据,我们可以使用循环来遍历数组的每个位置,并将数据赋值给对应的元素。创建和初始化二维数组在向二维数组添加数据之前,我们首先需要创建并初始化一个二维数组......
  • 初中英语优秀范文100篇-043Is Television Good or Bad?看电视是好是坏?
    PDF格式公众号回复关键字:SHCZFW043记忆树1Moreandmorepeoplelikewatchingtelevision.翻译越来越多的人喜欢看电视简化记忆电视句子结构1"Moreandmorepeople"是主语,表示越来越多的人。2"like"是谓语,表示喜欢或愿意。3"watchingtelevision"是宾语,表示......
  • 2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正
    2023-12-30:用go语言,给你一个下标从0开始的整数数组nums,它包含n个互不相同的正整数,如果nums的一个排列满足以下条件,我们称它是一个特别的排列。对于0<=i<n-1的下标i:要么nums[i]%nums[i+1]==0,要么nums[i+1]%nums[i]==0。请你返回特别排列的总数目,由于答......
  • 数组名不是首元素地址的情况
    1.&arr-&数组名-数组名不是首元素地址-数组名表示整个数组--&数组名,取出的是整个数组的地址2.sizeof(arr)-sizeof(数组名)-数组名表示的整个数组-sizeof(数组名)计算的是整个数组的大小#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ //两种数组名不是首元素......
  • 数组指针
    整型数组--里面存的是整型字符数组--里面存的是字符数组指针--里面存的是指针#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ inta=10;intb=20;intc=30; int*pa=&a; int*pb=&b; int*pc=&c; int*arr[3]={&a,&b,&c};//将三个元......
  • Codeforces Round 918 (Div. 4) (前缀和,权值树状数组,二维偏序, python + golang)
    Dashboard-CodeforcesRound918(Div.4)-Codeforces  fromcollectionsimport*defsolve():a,b,c=list(map(int,input().split()))hs=defaultdict(int)hs[a]+=1hs[b]+=1hs[c]+=1foriinhs:ifhs[i]=......
  • 2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正
    2023-12-30:用go语言,给你一个下标从0开始的整数数组nums,它包含n个互不相同的正整数,如果nums的一个排列满足以下条件,我们称它是一个特别的排列。对于0<=i<n-1的下标i:要么nums[i]%nums[i+1]==0,要么nums[i+1]%nums[i]==0。请你返回特别排列的总数目......
  • 游戏AI行为决策——GOAP(目标导向型行动规划)
    游戏AI行为决策——GOAP(附代码与项目)新的一年即将到来,感觉还剩一种常见的游戏AI决策方法不讲的话,有些过意不去。就在这年的尾巴与大家一起交流下「目标导向型行为规划(GOAP)」吧!另外,我觉得只是讲代码实现而没有联系具体项目,可能还是不容易理解的。所以这次我会在文末附上一个由本......