2024年最全Go-数组类型详解(声明、初始化、遍历、多维数组等)_strconv(1),2024年最新Golang音视频面试题

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

strNum := “123.hello”
floatNum, er := strconv.ParseFloat(strNum,64)
fmt.Println(floatNum,er)


 结果



> 
> 0 strconv.ParseFloat: parsing "123.hello": invalid syntax
> 
> 
> 


## 介绍


* 数组是**值类型**,默认情况下作为参数传递给函数时会拷贝,不影响原数组。可通过形参为数组指针,实参为数组地址来修改。
* 声明时,默认值为**零值**(0、""、false等)
* 声明**固定长度**,不能动态变化
* 元素的**数据类型要相同**
* 占用**内存连续**


## 声明



> 
> 
> ```
> var variable_name [SIZE]variable_type
> ```
> 
> 


**代码** 



//声明数组
var arr [3]int

## 声明并初始化



> 
>  var variable\_name [SIZE]variable\_type = [SIZE]variable\_type{value1,value2...}
> 
> 
>  var variable\_name = [SIZE]variable\_type{value1,value2...}
> 
> 
> variable\_name := [...]variable\_type{value1,value2...}
> 
> 
> variable\_name := [...]variable\_type{index1:value1,index2:value2}
> 
> 
> 


注意:size可以使用...省略,推导



//初始化数组
var arr1 [3]int = [3]int{1,2,3}
var arr2 = [3]int{1:4,0:5,2:6}
arr3 := […]int{7,8,9}
arr4 := [5]int{1:3,3:5}


## 遍历


### for循环,下标



n1 := len(arr1)
for i:=0;i<n1;i++{
	fmt.Print(arr1[i]," ")
}

### for range



> 
> for key,value := range
> 
> 
> 



for _,n := range arr3{
	fmt.Print(n," ")
}

\_是匿名变量,可以看之前的文章了解变量和常量。


## 内存


src->cmd->compile->internal->types->type.go



// Array contains Type fields specific to array types.
type Array struct {
Elem *Type // element type
Bound int64 // number of elements; <0 if unknown yet
}



// NewArray returns a new fixed-length array Type.
func NewArray(elem *Type, bound int64) *Type {
if bound < 0 {
Fatalf(“NewArray: invalid bound %v”, bound)
}
t := New(TARRAY)
t.Extra = &Array{Elem: elem, Bound: bound}
t.SetNotInHeap(elem.NotInHeap())
return t
}


TARRAY是Array指针,以arr4为例,Go会生成一个连续空间,将第一个的地址给arr4第一个值\*Type,长度给arr4的第二个值Bound。


![](https://img-blog.csdnimg.cn/20210418203108214.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xhZHlfa2lsbGVyOQ==,size_16,color_FFFFFF,t_70)



fmt.Printf("arr4:%v &arr4:%p &arr4[0]:%v &arr4[1]:%v\n",arr4, &arr4,&arr4[0], &arr4[1])

结果



> 
>  arr4:[0 3 0 5 0] &arr4:0xc00000c450 &arr4[0]:0xc00000c450 &arr4[1]:0xc00000c458
> 
> 
> 


以arr4为例,数组地址和第一个元素的地址一样,后面相差的为元素所占字节数,这里是int,所以差8。


## 数组作为参数


### 值传递


值传递,返回数组最大值下标



// 求数组最大值及下标
func getMax(arr [5]int)(int,int){
maxValue := arr[0]
index := 0
for i,v := range arr{
if v > maxValue {
maxValue = v
index = i
}
}
return index, maxValue
}


注意:数组的长度也是数组类型的一部分,[2]int和[3]int是不一样的类型。如果你发现有人的代码写的[]int,可以传递任意长度的“数组”,那么,他说错了,他说的是切片而不是数组。


**调用代码**



index,value := getMax(arr4)


### 引用传递



//原地反转数组
func reverseArr(arr *[10]int){
i:=0
j:=len(*arr) - 1
for{
if i>=j{
break
}
(*arr)[i],(*arr)[j] = (*arr)[j],(*arr)[i]
i++
j–
}
}


**调用代码**



arr6 := [10]int{1,4,7,-9,99,2,5,78,22,33}
reverseArr(&arr6)


## 多维数组


以二维数组为例


二维数组:一维数组,每个元素是一维数组(首元素)地址,数组长度为列数


### 声明



var arr7 [2][3]int


### 声明并初始化



var arr8 = […][2]int{{1,2},{2,3}}
arr9 := [1][2]int{{5,6}}
fmt.Println(“arr7 arr8 arr9”,arr7,arr8,arr9)


### 遍历


for



for i:=0;i<len(arr8);i++{
	for j:=0;j<len(arr8[0]);j++{
		fmt.Print(arr8[i][j]," ")
	}
	fmt.Println()
}

for range



for _,row := range arr8{
	for _,val:= range row{
		fmt.Print(val," ")
	}
	fmt.Println()
}

### 内存


![](https://img-blog.csdnimg.cn/20210418202612933.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xhZHlfa2lsbGVyOQ==,size_16,color_FFFFFF,t_70)


大概应该是这样,是一维数组指针,没有记录Bound,因为一位数组有记录元素个数,就不必再记录一次了。由于不能.出Bound来,另外,也是刚入门Go,没有仔细阅读源代码,有大佬知道的话可以下方评论,或者等某天如果我发现错了,再回来改。


## 全部代码



package main

import “fmt”
// 创建26大小数组,存放A-Z
func alpha(){
alpha := [26]byte{}
var A byte = ‘A’
for i :=0;i<26;i++{
alpha[i] = A + byte(i)
}
fmt.Printf(“%c\n”,alpha)
}
// 求数组最大值及下标
func getMax(arr [5]int)(int,int){
maxValue := arr[0]
index := 0
for i,v := range arr{
if v > maxValue {
maxValue = v
index = i
}
}
return index, maxValue
}

//原地反转数组
func reverseArr(arr *[10]int){
i:=0
j:=len(*arr) - 1
for{
if i>=j{
break
}
(*arr)[i],(*arr)[j] = (*arr)[j],(*arr)[i]
i++

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

= (*arr)[j],(*arr)[i]
i++

[外链图片转存中…(img-c2Nm0Kyo-1715399289669)]
[外链图片转存中…(img-iUal5DRA-1715399289669)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值