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

这篇具有很好参考价值的文章主要介绍了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)
	}

Golang 中的数组Array以及Slice底层实现,# Golang,算法,数据结构

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

Golang 中的数组Array以及Slice底层实现,# Golang,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-595502.html

 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++

到了这里,关于Golang 中的数组Array以及Slice底层实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • go语言Array 与 Slice

    有的语言会把数组用作常用的基本的数据结构,比如 JavaScript,而 Golang 中的数组(Array),更倾向定位于一种底层的数据结构,记录的是一段连续的内存空间数据。但是在 Go 语言中平时直接用数组的时候不多,大多数场景下我们都会直接选用更加灵活的切片(Slice) 声明与初始化

    2024年02月07日
    浏览(38)
  • 数据结构与算法 | 数组(Array)

    数组(Array)应该是最基础的数据结构之一,它由相同类型的元素组成的集合,并按照一定的顺序存储在内存中。每个元素都有一个唯一的索引,可以用于访问该元素。 数组索引(Index): 数组中的每个元素都有一个唯一的整数索引,从0开始计数。索引用于访问数组中的元素

    2024年02月08日
    浏览(51)
  • 检查两个数组在维度,形状以及元素值上是否均等价 numpy.array_equiv()

    【小白从小学Python、C、Java】 【计算机等级考试+500强双证书】 【Python-数据分析】 检查两个数组在维度,形状 以及元素值上是否均等价 numpy.array_equiv() [太阳]选择题 请问以下代码中执行语句输出结果依次是? import numpy as np a = np.array([1, 2]) b = np.array([1, 2]) c = np.array([1, 3]) d =

    2024年02月07日
    浏览(48)
  • go数据类型-slice底层

    有上篇string为基础了,能猜到slice肯定也有一个对应的struct。 切片的本质是对数组的引用 len 表示当前已经存储的个数,cap表示容量。 根据数组创建 字面量:编译时插入创建数组的代码 make:运行时创建数组 扩容时,编译时转为调用 runtime.growslice() 有兴趣的可以看下源码,方

    2024年02月05日
    浏览(35)
  • Golang Map底层实现简述

    Go的 map 是一种高效的数据结构,用于存储键值对。其底层实现是一个哈希表(hash table),下面是有关 map 底层实现的详细介绍: 哈希表 : map 的底层实现是一个哈希表,也称为散列表。哈希表是一个数组,其中每个元素被称为\\\"桶\\\",用于存储键值对。 哈希表的大小是可动态

    2024年02月08日
    浏览(44)
  • 【算法】Two Sum II - Input Array Is Sorted 两数之和 II - 输入有序数组

    给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 = index1 index2 = numbers.length 。 以长度为 2 的整数数组 [index1, index2] 的形式返回这两个

    2024年02月13日
    浏览(49)
  • Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理

    目录 管道(channel) 无缓冲管道 有缓冲管道 需要注意 goroutine与channel实现并发 单向管道 定义单向管道 将双向管道转换为单向管道 单向管道作为函数参数 单向管道的代码示例 select多路复用 案例演示 goroutine panic处理 案例演示 管道(channel)是 Go 语言中实现并发的一种方式,

    2024年02月06日
    浏览(46)
  • Golang学习——string和slice切片

    1个字节可以表示256个数字,2个字节可以表示65536个数字 字符集:字符编号对照表。收录很多数字,给它们一一编号。 字符集的更迭 全球化统一标准——通用字符集 于1990年开始研发并于1994年正式公布,实现了跨语言跨平台的文本转换与处理。 字符集促成了字符与二进制的

    2024年02月15日
    浏览(39)
  • 【LeetCode 算法】Minimum Operations to Halve Array Sum 将数组和减半的最少操作次数-Greedy

    给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它 减小 到 恰好 一半 。(注意,在后续操作中你可以对减半过的数继续执行操作) 请你返回将 nums 数组和 至少 减少一半 的 最少 操作数。 1 = n u m s . l e n g t h = 1 0 5 1 = n u m s [ i ] = 1 0 7 1 = num

    2024年02月15日
    浏览(46)
  • golang slice 作为参数值传递情况说明

    golang 中引用类型有:slice、map、interface、channel golang所有类型在函数中都是值传递,这个跟上面golang中有的数据类型为引用类型并不冲突,用下面四个slice实例帮助理解 说明: main 函数中slice[0]说明 fn 函数里面的修改,也改变函数外的值,这跟slice为引用类型的缘故 说明:s

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包