五、Golang 中的数组Array以及Slice底层实现

1、Array(数组)

数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素 (element),这种类型可以是任意的原始类型,比如 int string 等,也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。
Golang 中数组是一个长度固定的数据类型, 数组的长度是类型的一部分 ,也就是说 [5]int [10]int 是两个不同的类型。
Golang中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。
    1. 数组:是同一种数据类型的固定长度的序列。
    2. 数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。
    3. 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。
    4. 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1
    for i := 0; i < len(a); i++ {
    }
    for index, v := range a {
    }
    5. 访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic
    6. 数组是值类型,赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会改变本身的值。
    7.支持 "=="、"!=" 操作符,因为内存总是被初始化过的。
    8.指针数组 [n]*T,数组指针 *[n]T。
    var arr0 [2]int
	var arr2 [3]int
	fmt.Printf("arr0:%T内容为%v,  arr2:%T,内容为%v\n" , arr0,arr0,arr2, arr2)
	
	var arr =  [...]string{"卫宫士郎","远坂樱","继国缘一"}
	fmt.Printf("aaa的类型为%T,内容为%v",arr,arr)

 2、数组定义

比如: var a [5]int , 数组的长度必须是常量,并且长度是数组类型的一部分。一旦定义,长
度不能变。 [5]int [4]int 是不同的类型。

3、数组的初始化

数组的初始化也有很多方式。,
后面直接带赋值的需要在定义的数组后加等于号

方法一

初始化数组时可以使用初始化列表来设置数组元素的值。
	var shuzu [3]int
	shuzu[0] = 1
	shuzu[1] = 2
	shuzu[2] = 3
	fmt.Println(shuzu)

	var arr3 [3]string
	arr3[0] = "卫宫士郎"
	arr3[1] = "漩涡鸣人"
	arr3[3] = "比目鱼"	 //out of bounds for 3-element array
	fmt.Println(arr3)	

方法二

按照上面的方法每次都要确保提供的初始值和数组长度一致,一般情况下我们可以让编译器
根据初始值的个数自行推断数组的长度,例如:

	var arr4 = [3]int{1,2,3}
	fmt.Println(arr4)

方法三

我们还可以使用指定索引值的方式来初始化数组,例如 :
	var arr5 = [...]int{1,2,3,4,5,6}
	fmt.Print(arr5,"数组的长度为",len(arr5))

	// 注意数组的长度,改变数组里面的值
	var arr6 = [...]string{"卫宫士郎","宋东野","斑马"}
	arr6[0] = "奥特曼" 
	fmt.Print(arr6)

	// var arr6 = [...]string{"卫宫士郎","宋东野","斑马"}
	// arr6[3] = "奥特曼" //index 3 out of bounds [0:3]
	// fmt.Print(arr6)
	// 这样的不行,需要注意数组的长度,类型;

方法四

数组的初始化 第四种方法   我们还可以使用指定索引值的方式来初始化数组

arr7 := [...]int{0:1,2:2,4:10}
fmt.Printf("数组的内容为%v,类型为%T,个数为%v",arr7,arr7,len(arr7))

4、数组的遍历

	arr7 := [...]string{"sabar","archer","rider"}
	for i := 0; i < len(arr7); i++ {
		fmt.Printf("值为%v\n",arr7[i])
		
	}

	arr1 := [...]string{"php", "nodejs", "golnag", "js"}

	for k, v := range arr1 {
		fmt.Printf("key:%v value:%v\n", k, v)
	}

5、几则练习

1、求出一个数组里面元素的和以及这些元素的平均值。 

	var sum = 0
	arr1 := [...]int{1,2,3,4,5,6,7}
	for i := 0; i < len(arr1); i++ {
		sum += arr1[i]
	}
	fmt.Printf("数组的和为%v.其平均值为%v",sum,sum/len(arr1))

 2、请求出一个数组的最大值,并得到对应的下标


1、 声明一个数组 var Arr = [...]int {1, -1, 12, 65, 11}
2、假定第一个元素就是最大值,下标就 0
3、然后从第二个元素开始循环比较,如果发现有更大,则交换
	arr2 := [...]int{21,222,312,42,33}
	max := arr2[0]
	index := 0
	for i := 0; i < len(arr2); i++ {
		if max < arr2[i]{
			max = arr2[i]
			index = i
		}
	}
	fmt.Printf("最大值:%v  最大值对应的索引值:%v", max, index)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵唯一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值