【30天熟悉Go语言】11 数组的全方位使用与解析

news2024/9/25 7:20:55

作者:秃秃爱健身,多平台博客专家,某大厂后端开发,个人IP起于源码分析文章 😋。
源码系列专栏:Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列(含:Ribbon、Feign)、Nacos源码系列、RocketMQ源码系列、Spring Cloud Gateway使用到源码分析系列、分布式事务Seata使用到源码分析系列、JUC源码系列
基础系列专栏:30天熟悉GO语言(建设中)
码文不易,如果感觉博主的文章还不错,请点赞👍、收藏 ⭐️支持一下博主哇 🙏
联系方式:Saint9768,加我进技术交流群,一起学习进步📚、freedom✈️🌊

文章目录

  • 一、前言
  • 二、数组
    • 1、数组定义
    • 2、数组初始化
      • 1)使用数组字面量初始化数组
      • 2)GO自动计算数组的长度
      • 3)指定特定元素的值
    • 3、数组内存分析
    • 4、数组使用
      • 1)访问数组元素
      • 2)同类型数组赋值
      • 3)将数组按引用传递
    • 5、数组遍历
  • 三、二维数组
    • 1、定义&赋值
    • 2、初始化
  • 四、总结

一、前言

在这里插入图片描述

Go系列文章:

  1. GO开篇:手握Java走进Golang的世界
  2. 2 Go开发环境搭建、Hello World程序运行
  3. 3 Go编程规约和API包
  4. 4 Go的变量、常量、运算符
  5. 5 Go 基本数据类型
  6. 6 Go 复杂数据类型之指针
  7. 7 Go流程控制之分支结构if、switch
  8. 8 Go流程控制之循环结构for range、goto、break、continue
  9. Go函数全方位解析
  10. Go异常处理机制

Go专栏传送链接:https://blog.csdn.net/saintmm/category_12326997.html

二、数组

在GO语言中,数组是一个长度固定的数据类型,用于存储相同类型的数据

1、数组定义

数组声明时需要指定内部存储的数据的类型,需要存储的元素的数量。数组声明完成之后,每个数组元素的默认值都是对应类型的零值。

数组定义格式:var arrayName [数组大小]数据类型

例如:声明一个包含3个元素的整型数组。

var array 3[int]

2、数组初始化

数组的初始化有三种方式:使用数组字面量、自动计算数组长度、指定特定索引位置元素的值。

1)使用数组字面量初始化数组

初始化一个包含3个元素的整型数组

var arr1 [3]int = [3]int{3,6,9}
fmt.Println(arr1)

或:

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

2)GO自动计算数组的长度

使用... 代替数组的长度,GO会根据初始化时数组元素的数量来确定该数组的长度。

arr3数组的长度为4。

var arr3 = [...]int{1,3,5,7}
fmt.Println(arr3)

3)指定特定元素的值

在已知数组长度的前提下,可以给数组的特定索引位置指定具体的值。

下面初始化一个长度为3的数组,并乱序指定索引0和索引2位置的元素值分别为3,9。

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

3、数组内存分析

数组开辟的内存空间是一块连续的内存空间,其访问/修改效率很高。

示例:

package main

import "fmt"

func main() {
	// 定义数组
	var arr [3]int32
	// 打印数组
	fmt.Println(arr)

	// arr的内存地址值
	fmt.Printf("arr的地址为:%p", &arr)
	fmt.Println()
	// arr[0]内存地址值
	fmt.Printf("arr[0]的地址为:%p", &arr[0])
	fmt.Println()
	// arr[1]内存地址值
	fmt.Printf("arr[1]的地址为:%p", &arr[1])
	fmt.Println()
	// arr[2]内存地址值
	fmt.Printf("arr[2]的地址为:%p", &arr[2])
}

输出:
在这里插入图片描述

内存使用解析:

示例中 int32类型的数组arr,内存地址为0xc00001a0c0,则arr[n]的内存地址为 0xc00001a0c0 + 4*n

在这里插入图片描述

4、数组使用

1)访问数组元素

要访问数组里的某个元素,使用[]运算符。

package main

import "fmt"

func main() {
	arr1 := [3]int{1,2,3}
	fmt.Println("arr1[0]的值为:", arr1[0])
}

输出:
在这里插入图片描述

2)同类型数组赋值

可以把同样类型的一个数组赋值给另外一个数组。

// 声明一个包含3个元素的整型数组
var arr [3]int32

arr1 := [3]int32{1,2,3}

// 把arr1的值赋值给arr
arr = arr1

注意:数组长度属于类型的一部分,即:数组变量的类型包括两步分:数组长度和每个元素的类型,只有这两部分都相同的数组,才是类型相同的数组,才能互相赋值。

package main

import "fmt"

func main() {
	arr1 := [3]int{1,2,3}
	fmt.Printf("arr1数组的类型为:%T\n", arr1)

	arr2 := [6]int{1,2,3,4,5,6}
	fmt.Printf("arr2数组的类型为:%T\n", arr2)
}

在这里插入图片描述
从输出来看:arr1和arr2的类型分别为[3]int、[6]int。

此外,编译器会阻止类型不同的数组互相赋值。
在这里插入图片描述

3)将数组按引用传递

在go中数据属于值类型,默认情况下按值传递,将数组作为参数在函数之间传递时,会进行值拷贝;

package main

import "fmt"

func main() {
	arr1 := [3]int{1,2,3}
	// 数组默认按值传递,函数不会改变arr1的元素值
	changeArrayValue(arr1)
	fmt.Println("arr1数组为:", arr1)
}
func changeArrayValue(arr [3]int) {
	arr[0] = 7
}

输出:
在这里插入图片描述

  • 从输出内容可以得知,函数间默认传递数据的方式是按值传递;在子函数(changeArrayValue)中修改数组,不会影响父函数(main)中数组的值。

根据内存和性能来看,在函数见传递数组是一个开销很大的操作。因此我们可以选择使用指针在函数间传递数组。

package main

import "fmt"

func main() {
	arr1 := [3]int{1,2,3}
	// 使用指针的方式做引用传递,函数会改变arr1的元素值
	changeArrayValueByPointer(&arr1)
	fmt.Println("arr1数组为:", arr1)
}

func changeArrayValueByPointer(arr *[3]int) {
	arr[0] = 7
}

输出:

在这里插入图片描述

  • 将数组以指针的方式传递时,数组都指向同一组数据,子函数中修改数组的元素值,父函数中可以感知到。

5、数组遍历

两种遍历方式:普通for循环、for range。

示例:

package main

import "fmt"

func main() {
	// 定义数组
	var scores [4]int
	scores[0] = 99
	scores[1] = 97
	scores[2] = 89
	scores[3] = 91

	// 遍历数组
	// 方法一:普通for循环
	for i :=0; i< len(scores); i++ {
		fmt.Println(scores[i])
	}
	fmt.Println()
	// 方法二:for range
	for key,value := range scores {
		fmt.Printf("第%d个学生的成绩的为:%d\n", key, value)
	}
}

输出:

在这里插入图片描述

三、二维数组

二维数组、乃至多维数组,本质上只是一维数组中的元素值变成了数组,故多维数组的特性和一维数组保持一致。二维数组的遍历也是两种方式:普通for循环、for range。

此处我们介绍一下二维数组的声明、初始化。

1、定义&赋值

package main

import "fmt"

func main() {
	// 定义数组
	var arr [2][3]int32
	fmt.Println(arr)

	fmt.Printf("arr的地址为:%p\n", &arr)
	fmt.Printf("arr[0]的地址为:%p\n", &arr[0])
	fmt.Printf("arr[0][0]的地址为:%p\n", &arr[0][0])

	fmt.Printf("arr[1]的地址为:%p\n", &arr[1])
	fmt.Printf("arr[1][0]的地址为:%p\n", &arr[1][0])

	// 赋值
	arr[0][1] = 12
}

在这里插入图片描述

2、初始化

初始化方式和一维数组一样

// 使用数组字面量初始化数组
var arr1 [2][3]int32 = [2][3]int32{{1,2,3},{4,5,6}}
fmt.Println(arr1)

在这里插入图片描述

四、总结

本文内容从数组的定义、初始化 到 数组使用 以及 数组的内存分析。

数组的初始化方式有三种:数组字面量、不定长数组、指定特定元素值;数组的同类型是指两个数组长度相等、元素值类型相等。

另外,数组默认是按值传递,可以使用传递数组指针的方式实现按引用传递。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/935224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工厂机械臂人员闯入自动预警

工厂机械臂人员闯入自动预警系统通过yolov8系列网络模型深度学习算法&#xff0c;工厂机械臂人员闯入自动预警算法实时监测工作区域内的人员位置和机械臂设备的运行状态&#xff0c;实现对人员闯入的识别和预警。一旦系统检测到人员闯入作业区域&#xff0c;立即发出警报并同步…

java八股文面试[多线程]——什么是线程安全

对线程安全的理解 总结&#xff1a;一个进程内的多个线程同时访问堆内存。 知识来源&#xff1a; 【并发与线程】对线程安全的理解_哔哩哔哩_bilibili

Linux 多线程基础

文章目录 前言一、多线程基础函数1. pthread_create2. pthread_self3. pthread_exit4. pthread_join5. pthread_cancel6. pthread_detach 二、线程间的共享数据三、多线程 &#xff0c;进程对比总结 前言 一、多线程基础函数 1. pthread_create 创建新的线程。 #include <…

第二章 Linux基础命令

目录 一、 Linux的目录结构  1.学习目标  2.Linux的目录结构  3.Linux路径的描述方式  4.本小节的总结  5.课后练习 二、 Linux命令入门  2.1 Linux命令基础  1.学习目标  2.什么是命令、命令行  3.Linux命令基础格式  4.本小节的总结 2.2 ls命令入门  1…

KMP算法开荒

文章目录 一 、前言二、 暴力解法三、KMP算法原理3.1 自动子串的指针3.2 跳过多少个字符3.3 next数组 - 暴力3.4 next数组 - 求解 四 KMP实现 一 、前言 字符串匹配 import re print(re.search(www, www.runoob.com).span()) # 在起始位置匹配 print(re.search(com, www.run…

Java“牵手”天猫商品sku信息API接口数据,天猫API接口申请指南

天猫平台商品sku属性信息接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品销量接口API是一种用于获取电商平台上商品sku属性数据的接口&#…

无涯教程-KNN算法 - 寻找最近邻居

K最近邻(KNN)算法是一种监督的ML算法&#xff0c;可用于分类以及回归预测问题&#xff0c;但是&#xff0c;它主要用于行业中的分类预测问题。以下两个属性将很好地定义KNN- 惰性学习算法 - KNN是一种惰性学习算法&#xff0c;因为它没有专门的训练阶段&#xff0c;并且在分…

Java-继承和多态(下)

补全构造方法 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);while (scanner.hasNextInt()) {int x scanner.nextInt();int y scanner.nextInt();int z scanner.nextInt();Sub sub new…

【Python】基于Python的电话簿(Phonebook project)设计【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

使用Rust开发命令行工具

生成二进制文件&#xff0c;将其扔到环境变量的path下即可~ 用rust打造实时天气命令行工具[1] 找到合适的API 使用该api[2] 如请求 api.openweathermap.org/data/2.5/weather?qBeijing&appidyour_key: { "coord": { "lon": 116.3972, "lat&quo…

变天了,国产技术突破让黑黄金变成白菜价,芯片技术变革时代来了

由于众所周知的原因&#xff0c;美国企图利用它掌握的硅基芯片技术体系&#xff0c;阻止中国发展先进芯片&#xff0c;不过中国科技界在一项重要芯片材料方面已取得重大突破&#xff0c;还让这种芯片材料变成白菜价&#xff0c;将改变硅基芯片技术主导的时代。 这种芯片材料就是…

小研究 - JVM 的类装载机制

本文通过对一个类装载实例的分析&#xff0c;阐明了 Java虚拟机的类装载的代理机制和由此定义的命名空间&#xff0c;指出了类装载机制在容器/组件/抽象框架结构中的作用。 目录 1 引言 2 实例 3 分析 3.1 类装载的代理机制 3.2 Java的命名空间 3.3 解决问题 4 应…

全栈之前端 | 1.CSS3必备基础知识学习

关注回复【学习交流群】加入【安全开发运维】答疑交流群 请朋友们【多多点击文中的广告】&#xff0c;支持作者更新更多文章。 目录: 0x00 前言简述 描述: 前面跟随着WeiyiGeeker作者【全栈工程师修炼指南】公众号一起学习了前端基础的知识以及HTML标签、属性、事件、字符集系列…

寻找注册配置中心最佳评测官,赢取丰厚奖品 | 测评开启,开发者请速速集结

评测前请点击文末链接&#xff0c;领取 MSE-Nacos 免费试用&#xff0c;再启动评测。 注册配置中心 MSE-Nacos (以下简称 MSE-Nacos)&#xff0c;即 Nacos 的企业版&#xff0c;开箱即用的 Nacos 云服务&#xff0c;对 Nacos 内核进行企业级稳定性加固&#xff0c;故障自动检测…

统计学补充概念-13-逻辑回归

概念 逻辑回归&#xff08;Logistic Regression&#xff09;实际上是一种用于解决分类问题的统计学习方法&#xff0c;尽管其名称中带有"回归"一词&#xff0c;但它主要用于处理分类任务。逻辑回归用于预测一个事件发生的概率&#xff0c;并将其映射到一个特定的输出…

js的this指向问题

代码一&#xff1a; 这段代码定义了run函数、obj对象&#xff0c;然后我们把run函数作为obj的方法。 function run(){console.log(this);}let obj{a:1,b:2};obj.runrun;obj.run(); 那么我们调用obj的run方法&#xff0c;那么这个方法打印的this指向obj。 分析&#xff1a;即…

第十三课 宾语从句

文章目录 前言一、宾语从句1、主语及物动词宾语从句2、主语双宾动词间接宾语直接宾语3、主语特定及物动词宾语从句&#xff08;作宾语&#xff09;宾补4、主语be某些形容词宾语从句5、动词不定式后面的宾语从句6、动名词后面的宾语从句7、介词后面的宾语从句9、间接引语 前言 一…

基于LOF算法的异常值检测

目录 LOF算法简介Sklearn官网LOF算法应用实例1Sklearn官网LOF算法应用实例2基于LOF算法鸢尾花数据集异常值检测读取数据构造数据可视化&#xff0c;画出可疑异常点LOF算法 LOF算法简介 LOF异常检测算法是一种基于密度的异常检测算法&#xff0c;基于密度的异常检测算法主要思想…

Centos7安装ZK-UI管理界面安装|Maven|Git|

一: JDK1.8安装 参考: Centos7卸载|安装JDK1.8|Xshell7批量控制多个终端 二&#xff1a;Maven安装 2.1&#xff1a;下载maven安装包 maven 下载地址&#xff1a;https://mirror.bit.edu.cn/apache/maven/maven-3/ [rootwww ~]# mkdir -p /usr/local/maven [rootwww ~]# …

【C/C++】多态的概念 | 虚函数 | 虚函数指针

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…