Golang 【basic_leaming】数组

news2024/12/23 2:12:42

阅读目录

  • Array(数组)
    • 数组定义
    • 数组的初始化
      • 方法一
      • 方法二
      • 方法三
    • 数组的遍历
    • 数组是值类型
    • 多维数组
      • 二维数组的定义
      • 二维数组的遍历
    • 数组练习题
      • 1、请求出一个数组的和以及平均值 for-range
      • 2、请求出一个数组的最大值,并得到对应的下标
      • 3、从数组 [1, 3, 5, 7, 8] 中找出和为 8 的两个元素的下标分别为 (0,3)和(1,2)

Array(数组)

数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int、string 等,也可以是用户自定义的类型。

一个数组包含的元素个数被称为数组的长度。

在Golang 中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说 [5]int[10]int 是两个不同的类型。

Golang 中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。

和数组对应的类型是 Slice(切片),Slice 是可以增长和收缩的动态序列,功能也更灵活,但是想要理解 slice 工作原理的话需要先理解数组,所以本节主要为大家讲解数组的使用。

在这里插入图片描述
数组基本语法:

package main

func main() {
	// 定义一个长度为3 元素类型为int 的数组a
	var a [3]int
	// 定义一个长度为3 元素类型为int 的数组b 并赋值
	var b [3]int
	b[0] = 80
	b[1] = 100
	b[2] = 96
}

数组定义

var 数组变量名[元素数量]T

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

var a [3]int
var b [4]int
a = b //不可以这样做,因为此时a 和 b 是不同的类型

数组可以通过下标进行访问,下标是从0 开始,最后一个元素下标是:len-1,访问越界(下标在合法范围之外),则触发访问越界,会 panic

数组的初始化

数组的初始化也有很多方式。

方法一

初始化数组时可以使用初始化列表来设置数组元素的值。

package main

import "fmt"

func main() {
	//数组会初始化为int 类型的零值
	var testArray [3]int
	//使用指定的初始值完成初始化
	var numArray = [3]int{1, 2}
	//使用指定的初始值完成初始化
	var cityArray = [3]string{"北京", "上海", "深圳"}
	fmt.Println(testArray) //[0 0 0]
	fmt.Println(numArray)  //[1 2 0]
	fmt.Println(cityArray) //[北京上海深圳]
}

方法二

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

package main

import "fmt"

func main() {
	var testArray [3]int
	var numArray = [...]int{1, 2}
	var cityArray = [...]string{"北京", "上海", "深圳"}
	fmt.Println(testArray) //[0 0 0]
	fmt.Println(numArray)  //[1 2]
	//type of numArray:[2]int
	fmt.Printf("type of numArray:%T\n", numArray)
	//[北京上海深圳]
	fmt.Println(cityArray)
	//type of cityArray:[3]string
	fmt.Printf("type of cityArray:%T\n", cityArray)
}
PS E:\golang\src> go run .\main.go
[0 0 0]
[1 2]
type of numArray:[2]int
[北京 上海 深圳]
type of cityArray:[3]string
PS E:\golang\src>

方法三

我们还可以使用指定索引值的方式来初始化数组,例如:

package main

import "fmt"

func main() {
	a := [...]int{1: 1, 3: 5}
	// [0 1 0 5]
	fmt.Println(a)
	//type of a:[4]int
	fmt.Printf("type of a:%T\n", a)
}

数组的遍历

遍历数组 a 有以下两种方法:

package main

import "fmt"

func main() {
	var a = [...]string{"北京", "上海", "深圳"}
	// 方法1:for 循环遍历
	for i := 0; i < len(a); i++ {
		fmt.Println(a[i])
	}
	// 方法2:for range 遍历
	for index, value := range a {
		fmt.Println(index, value)
	}
}
PS E:\golang\src> go run .\main.go
北京
上海
深圳
0 北京
1 上海
2 深圳
PS E:\golang\src>

数组是值类型

数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值。

package main

import "fmt"

func modifyArray(x [3]int) {
	x[0] = 100
}
func modifyArray2(x [3][2]int) {
	x[2][0] = 100
}
func main() {
	a := [3]int{10, 20, 30}

	//在modify 中修改的是a 的副本x
	modifyArray(a)
	fmt.Println(a) //[10 20 30]

	b := [3][2]int{
		{1, 1},
		{1, 1},
		{1, 1},
	}
	//在modify 中修改的是b 的副本x
	modifyArray2(b)
	//[[1 1] [1 1] [1 1]]
	fmt.Println(b)
}
PS E:\golang\src> go run .\main.go
[10 20 30]
[[1 1] [1 1] [1 1]]
PS E:\golang\src>

注意:

1、数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的。
2、[n]*T 表示指针数组,*[n]T 表示数组指针、

多维数组

Go 语言是支持多维数组的,我们这里以二维数组为例(数组中又嵌套数组)。

var 数组变量名[元素数量][元素数量]T
var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type

在这里插入图片描述

二维数组的定义

package main

import "fmt"

func main() {
	a := [3][2]string{
		{"北京", "上海"},
		{"广州", "深圳"},
		{"成都", "重庆"},
	}
	fmt.Println(a)       //[[北京上海] [广州深圳] [成都重庆]]
	fmt.Println(a[2][1]) //支持索引取值:重庆
}

二维数组的遍历

package main

import "fmt"

func main() {
	a := [3][2]string{
		{"北京", "上海"},
		{"广州", "深圳"},
		{"成都", "重庆"},
	}
	for _, v1 := range a {
		for _, v2 := range v1 {
			fmt.Printf("%s\t", v2)
		}
		fmt.Println()
	}
}

PS E:\golang\src> go run .\main.go
北京    上海
广州    深圳
成都    重庆
PS E:\golang\src>

注意: 多维数组只有第一层可以使用…来让编译器推导数组长度。

例如:

package main

func main() {
	//支持的写法
	a := [...][2]string{
		{"北京", "上海"},
		{"广州", "深圳"},
		{"成都", "重庆"},
	}
	//不支持多维数组的内层使用...
	b := [3][...]string{
		{"北京", "上海"},
		{"广州", "深圳"},
		{"成都", "重庆"},
	}
}

数组练习题

1、请求出一个数组的和以及平均值 for-range

package main

import "fmt"

func main() {
	var intArr2 [5]int = [...]int{1, -1, 9, 90, 12}
	sum := 0
	for _, val := range intArr2 {
		//累计求和
		sum += val
	}
	//如何让平均值保留到小数.
	fmt.Printf("sum=%v 平均值=%v \n\n", sum, float64(sum)/float64(len(intArr2)))
	// sum=111 平均值=22.2
}

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

1、声明一个数组 var intArr[5] = [...]int {1, -1, 12, 65, 11}
2、假定第一个元素就是最大值,下标就 0
3、然后从第二个元素开始循环比较,如果发现有更大,则交换。

package main

import "fmt"

func main() {
	var intArr = [...]int{1, -1, 112, 65, 11}
	maxValue := intArr[0]
	maxIndex := 0
	for i := 0; i < len(intArr); i++ {
		if maxValue < intArr[i] {
			maxValue = intArr[i]
			maxIndex = i
		}
	}
	fmt.Println("最大值", maxValue, "最大值索引值", maxIndex)
}
PS E:\golang\src> go run .\main.go
最大值 112 最大值索引值 2
PS E:\golang\src>

3、从数组 [1, 3, 5, 7, 8] 中找出和为 8 的两个元素的下标分别为 (0,3)和(1,2)

package main

import "fmt"

func main() {
	arr := [...]int{1, 3, 5, 7, 8}
	for i := 0; i < len(arr); i++ {
		for j := i + 1; j < len(arr); j++ {
			if arr[i]+arr[j] == 8 {
				fmt.Printf("(%v,%v)\n", arr[i], arr[j])
			}
		}
	}
}
PS E:\golang\src> go run .\main.go
(1,7)
(3,5)
PS E:\golang\src>

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

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

相关文章

探花交友_第10章_搭建后台系统(新版)

探花交友_第10章_搭建后台系统&#xff08;新版&#xff09; 文章目录探花交友_第10章_搭建后台系统&#xff08;新版&#xff09;1.1 概述1.2 API网关1.2.1 搭建网关依赖引导类跨域问题配置类配置文件测试1.2.2 配置鉴权管理器1.3 Nacos配置中心1.3.1 添加依赖1.3.2 添加boots…

33.数据统计

数据统计 后台系统首页中&#xff0c;显示各种统计数据&#xff0c;比如&#xff1a;累计用户数、新增用户数、登录次数等内容。 解决方案 数据库表分析 一、数据采集 需求&#xff1a; 1、探花系统将用户操作日志写入RabbitMQ 2、管理后台获取最新消息&#xff0c;构造日…

SpringBoot+微信小程序实现的云音乐小程序系统 附带详细运行指导视频

文章目录一、项目演示二、项目介绍三、项目运行截图四、主要代码一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot微信小程序框架开发的云音乐微信小程序系统。首先&#xff0c;这是一个前后端分离的项目&#xff…

C语言百日刷题第十五天

前言 今天是刷题第15天&#xff0c;放弃不难&#xff0c;但坚持一定很酷~ 再刷一套模拟题 C语言百日刷题第十五天前言一、选择题二、判断题三、多选题四、填空题五、分析程序题一、选择题 1.下列选项中&#xff0c;不属于开发一个C语言应用程序的具体实现步骤的是&#xf…

为什么网络应用程序是今年的主要攻击媒介之一

网络犯罪分子在绕过最新的网络应用程序防火墙方面的独创性正在将互联网应用程序变成今年增长最快的攻击媒介。面向公众的 Web 应用程序现在是渗透组织边界的最广泛使用的攻击媒介。 根据卡巴斯基全球应急响应团队最近的一份报告&#xff0c;始于 Web 应用程序的攻击从 2020 年…

ocker高级篇1-dockeran安装mysql主从复制

大家好&#xff0c;咱们前面通过十篇的文章介绍了docker的基础篇&#xff0c;从本篇开始&#xff0c;咱们的《docker学习系列》将要进入到高级篇阶段(基础篇大家可以查看之前发布的文章)。 咱们先来介绍&#xff1a;docker复杂方式安装软件。通过按照mysql\redis两个案例来讲解…

XC6SLX100-3FGG484C规格、XC7A15T-2CPG236I产品概述及应用

Spartan-6系列提供领先的系统集成能力&#xff0c;为大批量应用提供最低的总成本。这个由13个成员组成的家族扩展了逻辑单元的密度&#xff0c;从3840个扩展到147443个&#xff0c;功耗仅为之前斯巴达家族的一半&#xff0c;并且具有更快、更全面的连接。 Spartan-6系列基于成熟…

拯救动画卡顿之FLIP

前置知识 什么是FPS FPS是浏览器的每秒的渲染帧数&#xff0c;也就是浏览器切换画面的次数&#xff0c;大多数设备的刷新率都是60FPS&#xff0c;一般来说FPS越低页面就会越卡顿。 什么是像素管道&#xff1f; 像素管道是浏览器单个帧的渲染流水线&#xff0c;如果其中有某…

vue数据双向绑定

5.Vue数据双向绑定 5.1.什么是双向数据绑定 Vue.js 是一个 MVVM 框架&#xff0c;即数据双向绑定&#xff0c;即当数据发生变化的时候&#xff0c;视图也就发生变化&#xff0c;当视图发生变化的时候&#xff0c;数据也会跟着同步变化。这也算是 Vue.js 的精髓之处了。 值得…

[ MessAuto ]: 短信验证码自动填充,理论支持所有浏览器或 APP, Only For Mac

MessAuto 开源地址&#xff1a;https://github.com/LeeeSe/MessAuto MessAuto 是一款 macOS 平台 自动提取 短信验证码并 粘贴回车 的软件&#xff0c;百分百由Rust开发&#xff0c;适用于任何APP。 特点&#xff1a; 轻量&#xff1a;程序占用存储 1.8 M&#xff0c;占用内…

NLP学习笔记(三) GRU基本介绍

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲门控循环单元 (Gated Recurrent Unit, GRU) 文章行文思路如下&#xff1a; 首先通过长短期记忆网络引出为什么需要门控循环单元然后介绍门控循环单元的核心思想与运作方式最后通过简洁的代码深入理解门控循环单元的运作方…

奇舞周刊 476 期:代码在内存中的 “形状”

记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~奇舞推荐■ ■ ■代码在内存中的 “形状”众所周知&#xff0c;js 的基本数据类型有 number、string、boolean、null、undefined 等。那么问题来了 typeof null 和 typeof undefined 分别是什么呢&…

[附源码]Node.js计算机毕业设计果蔬预约种植管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

[内网渗透]—NTLM网络认证及NTLM-Relay攻击

NTML网络认证 Windows认证分为本地认证和网络认证,当我们开机登录用户账户时,就需要将lsass.exe进程转换的明文密码hash与 sam文件进行比对,这种方式即为——本地认证 而当我们访问同一局域网的一台主机上的SMB共享时,需要提供凭证通过验证才能访问,这个过程就会设计win…

【C++】list 的模拟实现

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;前言&…

Halcon条码和二维码质量评级

现在各行各业的人们都使用条码/二维码从生产阶段到销售点全程追踪他们 的产品。那么怎么验证生产出来的具有可读性&#xff0c;码的质量等级如何呢&#xff1f; 其实ISO行业标准已经给出了如何评估码的质量等级的标准&#xff0c;以下三种主要验证标准用于确定一维条码、二维码…

毕业设计 - 基于Java EE平台项目管理系统的设计与实现【源码+论文】

文章目录前言一、项目设计1. 模块设计2. 实现效果二、部分源码项目工程前言 今天学长向大家分享一个 java web项目: 基于Java EE平台项目管理系统的设计与实现 一、项目设计 1. 模块设计 从管理员角度看: 用户登入系统后&#xff0c;可以修改管理员的密码。同时具有以下功能…

最全的SpringMVC教程,终于让我找到了

1. 为啥要学 SpringMVC&#xff1f; 1.1 SpringMVC 简介 在学习 SpringMVC 之前我们先看看在使用 Servlet 的时候我们是如何处理用户请求的&#xff1a; 配置web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmln…

[附源码]Python计算机毕业设计国际美容会所管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Jetpack Compose中的动画

Jetpack Compose中没有沿用Android原有的View动画和属性动画&#xff0c;而是新创建了一套全新的动画系统API&#xff0c;这是理所当然的&#xff0c;因为旧的动画系统主要是基于View体系的&#xff0c;而Compose中需要针对的是Composable可组合函数进行处理&#xff0c;那么势…