Go-数组类型详解(声明、初始化、遍历、多维数组等)_strconv(2)

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

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

需要这份系统化资料的朋友,可以点击这里获取

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

声明并初始化

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。

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

内存

大概应该是这样,是一维数组指针,没有记录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++
		j--
	}
}
func main() {
    //------------------声明数组------------------
    var arr [3]int

    //-----------------初始化数组-----------------
    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}
    fmt.Println("arr arr1 arr2 arr3 arr4:",arr,arr1,arr2,arr3,arr4)

	//-------------------遍历数组----------------
	n1 := len(arr1)
	fmt.Print("数组arr1:")
	for i:=0;i<n1;i++{
		fmt.Print(arr1[i]," ")
	}
	fmt.Println()

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

	//--------------------内存----------------------
	fmt.Printf("arr4:%v &arr4:%p &arr4[0]:%v &arr4[1]:%v\n",arr4, &arr4,&arr4[0], &arr4[1])
	fmt.Println(&arr4[2])

	//-----------------数组做参数----------------------
	index,value := getMax(arr4)
    fmt.Println("arr4最大值的下标和值:",index,value)

	arr6 := [10]int{1,4,7,-9,99,2,5,78,22,33}
	reverseArr(&arr6)
    fmt.Println(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)

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

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

	//------内存----------
	fmt.Printf("&arr8:%p &arr8[0]:%p &arr8[1]:%p &arr8[0][0]:%v &arr8[1][0]:%v",&arr8, &arr8[0], &arr8[1], &arr8[0][0], &arr8[1][0])
}

结果截图

注意

  • 数组长度也是数组类型的一部分,所以即使元素类型相同,长度不同也是不一样的类型。
  • 如果两个数组大小相同元素可以使用==比较,那么,两个数组可以使用==判断是否相等,当所有元素都对应相等时,两个数组相等。

参考

Go-1.16.3源代码

思考题

有函数getMax

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



本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。


最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。


最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。


![](https://img-blog.csdnimg.cn/img_convert/311903982dea1d8a5d2c98fc271b5b41.jpeg)

**需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)**

### 学习路线图


 其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。


相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。


![](https://img-blog.csdnimg.cn/img_convert/1ddfaf7dc5879b1120e31fafa1ad4dc7.jpeg)


#### 网络安全工具箱


当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份**我自己整理的网络安全入门工具以及使用教程和实战。**


![](https://img-blog.csdnimg.cn/img_convert/bcd1787ce996787388468bb227d8f959.jpeg)


#### 项目实战


最后就是项目实战,这里带来的是**SRC资料&HW资料**,毕竟实战是检验真理的唯一标准嘛~


![](https://img-blog.csdnimg.cn/img_convert/35fc46df24091ce3c9a5032a9919b755.jpeg)


#### 面试题


归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

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

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值