Go语言之重要数组类型数组

news2024/11/27 14:46:05

我们之前学习过变量,当存储一个学生名字时可以name=“jack”,但是如果班级有三十人,每个人的名字都想存储到内存中怎么办呢?总不能用三十个变量分别存储吧,这时数组就可以发挥作用了。

数组其实是和字符串一样的序列类型,不同于字符串在内存中连续存储字符,数组用[]的语法将同一类型的多个值存储在一块连续内存中。

声明数组

var 数组名 [元素数量]元素类型
var names [5]string
fmt.Println(names,reflect.TypeOf(names)) // [    ] [5]string

var ages [5]int
fmt.Println(ages,reflect.TypeOf(ages)) // [0 0 0 0 0] [5]int

在这里插入图片描述

在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有如下三个基本特性:
一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。
有序性:数组中的元素是有序的,通过下标访问。
不可变性:数组一旦初始化,则长度(数组中元素的个数)不可变。

var x [3]int
var y [5]int

// x y的数据类型相同吗?

数组初始化

var names [5]string
var ages [5]int

names[0] = "张三"
names[1] = "李四"
names[2] = "王五"
names[3] = "赵六"
names[4] = "孙七"

fmt.Println(names)   // [张三 李四 王五 赵六 孙七]

ages[0] = 23
ages[1] = 24
ages[2] = 25
ages[3] = 26
ages[4] = 27

fmt.Println(ages) // [23 24 25 26 27]

在这里插入图片描述

声明并赋值

var names = [3]string{"张三","李四","王五"}
var ages = [3]int{23,24,25}
fmt.Println(names) // [张三 李四 王五]
fmt.Println(ages) // [23 24 25]

初始化方式: […]不限长度

var names = [...]string{"张三","李四","王五"}
var ages = [...]int{23,24,25}
fmt.Println(names,reflect.TypeOf(names))  // [张三 李四 王五] [3]string
fmt.Println(ages,reflect.TypeOf(ages))  // [23 24 25] [3]int

初始化方式:索引设置

var names = [...]string{0:"张三",2:"王五"}
fmt.Println(names) // [张三  王五]

基于索引访问和修改数组元素

var names = [...]string{"张三","李四","王五","赵六","孙七"}
// 索引取值
fmt.Println(names[2])
// 修改元素值
names[0] = "zhangsan"
fmt.Println(names)
// 切片取值
fmt.Println(names[0:4]) 
fmt.Println(names[0:])
fmt.Println(names[:3])
// 循环取值
for i:=0;i<len(names);i++{
    fmt.Println(i,names[i])
}
for k,v := range names{    // range 表达式是副本参与循环
    fmt.Println(k,v)
}

练习

func1_声明数组1() {
	//先声明再赋值
	//var 数组名[元素数量]元素类型
	var age [3]int
	fmt.Println(age)

	var names [5]string
	names[0] = "jack"
	fmt.Println(names)

	//数组的声明并赋值
	var names1 = [3]string{"jj", "haha"}
	fmt.Println(names1)

	var ages = [3]int{122, 456, 347}
	fmt.Println(ages)

	//数组省略长度赋值
	var names2 = [...]string{"小涛", "小光"}
	fmt.Println(names2)

	//索引赋值
	var names3 = [...]string{0: "yuan", 2: "rains"}
	fmt.Println(names3)
	fmt.Println(len(names3))
}
func2_数组的声明赋值索引操作() {
	var names = [5]string{"yuan", "rain", "alvin"}
	fmt.Println(names)
	//索引操作
	names[2] = "Alive"
	fmt.Println(names)
}
func3_数组的切片操作() {
	var arr = [5]int{1, 2, 34, 5, 6}
	//切片操作,数组[start索引:end索引]
	ints := arr[1:3]
	//[]int,这就是切片了,没有长度
	fmt.Println(ints, reflect.TypeOf(ints))
}
func4_遍历数组() {
	var arr = [5]int{1, 2, 33, 77, 99}
	//三要素for循环
	for i := 0; i < len(arr); i++ {
		fmt.Println(arr[i])
	}
}
func5步_range循环() {
	var arr = [5]int{1, 2, 33, 77, 99}
	for i, v := range arr {
		fmt.Println(i, v)
	}
}
func6_构建切片方式1() {
	//构建切片方式1,通过数组切片操作获得切片对象
	var arr = [3]string{"rain", "eric", "alvin"}
	fmt.Println(arr, reflect.TypeOf(arr))
	s1 := arr[0:2]
	fmt.Println(s1, reflect.TypeOf(s1))
	s2 := arr[1:]
	fmt.Println(s2, reflect.TypeOf(s2))
	s2[0] = "Yuan"
	fmt.Println(s1)
	fmt.Println(arr)
}
func7_构建切片方式2() {
	//切片是对数组的引用
	var a = [5]int{1, 2, 3, 4, 5}
	slice := a[:] //起始地址 长度 容量

	fmt.Printf("slice切片的长度:%d,容量:%d\n", len(slice), cap(slice))

	fmt.Println(slice) //[1 2 3 4 5]
	newSlice := slice[1:3]
	fmt.Println(newSlice) //[2 3]

	newSlice[1] = 1000
	fmt.Println(newSlice) //[2 1000]
	fmt.Println(slice)    //[1 2 1000 4 5]
}
func8_直接声明切片() {
	s := []int{10, 11, 12, 13, 14}
	s1 := s[1:4]
	//11,12,13,长度?容量?3 4
	fmt.Println(s1, len(s1), cap(s1))

	//12
	s3 := s1[1:2]
	//长度是1,容量是3
	fmt.Println(s3, len(s3), cap(s3))
}
func9_练习题() {

	/**

	type Slice struct {
	      Data uintptr   // 指针,指向底层数组中切片指定的开始位置
	      Len int        // 长度,即切片的长度
	      Cap int        // 最大长度(容量),也就是切片开始位置到数组的最后位置的长度
	}

	*/

	var a = [...]int{1, 2, 3, 4, 5, 6}
	a1 := a[0:3]
	a2 := a[0:5]
	a3 := a[1:5]
	a4 := a[1:]
	a5 := a[:]
	a6 := a3[1:2]
	fmt.Printf("输出结果%d,a1的长度%d,容量%d\n", a1, len(a1), cap(a1)) //1, 2, 3 长度:3,容量:6
	fmt.Printf("输出结果%d,a2的长度%d,容量%d\n", a2, len(a2), cap(a2)) //1, 2, 3, 4, 5 长度:5,容量:6
	fmt.Printf("输出结果%d,a3的长度%d,容量%d\n", a3, len(a3), cap(a3)) //2, 3, 4, 5 长度:4 容量:5
	fmt.Printf("输出结果%d,a4的长度%d,容量%d\n", a4, len(a4), cap(a4)) //2, 3, 4, 5, 6,长度:5 容量:5
	fmt.Printf("输出结果%d,a5的长度%d,容量%d\n", a5, len(a5), cap(a5)) //1, 2, 3, 4, 5, 6 长度:6 容量:6
	fmt.Printf("输出结果%d,a6的长度%d,容量%d\n", a6, len(a6), cap(a6)) //3 ,长度:1,容量:4
}
func10_练习题1() {
	s1 := []int{1, 2, 3}
	s2 := s1[1:] //2, 3
	s2[1] = 4
	fmt.Println(s1) // 1,2,4
}
func11_练习题2() {
	var a = []int{1, 2, 3}
	b := a //引用拷贝
	a[0] = 100
	fmt.Println(b) //100,2,3
}
func12步_make函数1() {
	//初始化创建空间,开辟空间
	var s = make([]int, 5, 10)
	s[0] = 100
	fmt.Println(s, reflect.TypeOf(s))
	fmt.Println(len(s), cap(s))
}
func13_练习题11() {
	a := make([]int, 5)
	b := a[0:3] //0,0,0
	a[0] = 100
	fmt.Println(a) //100,0,0,0,0
	fmt.Println(b) //100,0,0
}
func14步_append函数使用() {
	var s []int
	s1 := append(s, 1)
	fmt.Println(s1)

	s2 := append(s1, 2, 3, 4)
	fmt.Println(s2)

	var t = []int{5, 6, 7}
	s3 := append(s2, t...)
	fmt.Println(s3)
}
func15步_append函数使用1() {
	s := make([]int, 3, 10)
	s5 := append(s, 100)
	fmt.Println(s5) //[0 0 0 100]
}
func16步_append扩容机制容量不够2倍扩容() {
	//append扩容机制容量不够2倍扩容
	a := []int{11, 22, 33}
	fmt.Println(len(a), cap(a)) //3 3

	c := append(a, 44)
	a[0] = 100
	fmt.Println(a) //[100 22 33]
	fmt.Println(c) //[11 22 33 44]
}
func17_容量够了不需要扩容了() {
	a := make([]int, 3, 10)
	fmt.Println(a) //0,0,0
	b := append(a, 11, 22)
	fmt.Println(a) //0,0,0
	fmt.Println(b) //0,0,0,11,22
	a[0] = 100
	fmt.Println(a) //100,0,0
	fmt.Println(b) //100,0,0,11,22
}
func18_经典面试题() {
	arr := [4]int{10, 20, 30, 40}
	s1 := arr[0:2] //10,20
	s2 := s1
	//10,20,1,2,3
	s3 := append(append(append(s1, 1), 2), 3)
	s1[0] = 1000
	fmt.Println(s1)  //1000,20
	fmt.Println(s2)  //1000,20
	fmt.Println(s3)  //10,20,1,2,3
	fmt.Println(arr) //1000, 20, 1, 2
}
func19_切片的地址是否一致() {
	var s = []int{1, 2, 3}
	fmt.Printf("%p\n", &s)
	s = append(s, 4)
	fmt.Printf("%p\n", &s)
}
func20_向开头插入() {
	//向开头插入值或者切片
	var a = []int{1, 2, 3}
	ints := append([]int{0}, a...)
	fmt.Println(ints)
}
func21_任意位置插入() {
	var b = []int{1, 2, 3, 4, 5}
	var i = 2
	bb := append([]int{100}, b[i:]...)
	cc := append(b[:i], bb...)
	fmt.Println(cc)
}
func22_删除元素() {
	var c = []int{1, 2, 3, 4, 5}
	c = append(c[:2], c[2+1:]...)
	fmt.Println(c)
}

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

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

相关文章

深入了解加快网站加载时间的 JavaScript 优化技术

目录 01、最小化文件大小 01&#xff09;、JavaScript 代码示例&#xff1a;缩小前后 02、文件压缩 01&#xff09;、Gzip 和 Brotli 压缩方法 02&#xff09;、压缩的服务器端配置 03、捆绑以减少网络请求 01&#xff09;、捆绑说明 02&#xff09;、捆绑工具 03&…

OWASP常见Web安全漏洞

OWASP&常见Web安全漏洞 一、OWASP介绍二、OWASPTOP10与常见漏洞讲解2.1、OWASP Top10 2013 VS 20172.2、OWASP Top10 20212.3、A1&#xff1a;2017 注入2.3.1、SQL注入攻击2.3.2、命令注入攻击 2.4、A2&#xff1a;2017失效的身份认证&#xff08;业务逻辑漏洞&#xff09;…

Linux——动静态库的制作和使用超详细(实操+代码+原理介绍)

动静态库的制作和使用 1️⃣.动静态库介绍&#x1f3c0;静态库⚽️动态库&#x1f3c8;区别&#x1f3d0;使用动态库的优点包括&#xff1a;&#x1f3c9; 使用静态库的优点包括&#xff1a; 2️⃣静态库的制作&#x1f34a;Q:库文件能不能有main()函数&#xff1f;&#x1f34…

clickhouse基础数据类型 语法及使用可视化数据库工具 DBeaver

新建一个名为 test 的数据库&#xff1a;右击数据库点击新增&#xff0c;然后创建一张 test &#xff0c;utf8mb4 字符的&#xff0c;点击确定 在 test 数据库下新建一张数据表&#xff0c;如下所示&#xff1a;右击表&#xff0c;然后点击新建表 鼠标放列上面&#xff0c;右键…

b站视频播放三倍速

目录 一、操作 一、操作 document.querySelector(video).playbackRate 31、F12或者在当前界面鼠标右击选择检查 打开开发者工具平台 2、在console界面执行document.querySelector(video).playbackRate 3 document.querySelector(video).playbackRate 3

vector模拟实现

目录 vector相关接口实现 使用memcpy拷贝问题 迭代器失效 引起失效的操作 指定位置元素的删除操作 ​编辑引起底层空间改变的操作 vector相关接口实现 template<typename T> class vector { public:typedef T* iterator;typedef const T* const_iterator; public:…

基于MSP432P401R跟随小车(一)【2022年电赛】

文章目录 一、赛前准备1. 硬件清单2. 工程环境 二、赛题思考三、软件设计1. 路程、时间、速度计算2. 距离测量3. 双机通信4. 红外循迹 四、技术交流 一、赛前准备 1. 硬件清单 主控板&#xff1a; MSP432P401R测距模块&#xff1a; GY56数据显示&#xff1a; OLED电机&#x…

MinUv2靶场详解

MinUv2靶场详解 这个靶场我学到了.bash_history文件&#xff0c;每个用户都有一个名为 .bash_history 的文件&#xff0c;它位于用户的主目录中&#xff0c;默认有500行最近执行的命令。 这个靶场我用vmware是不能打开的&#xff0c;用virtualBox就可以&#xff0c;并且打开时…

MySQL索引、事务

目录 索引 作用 查看索引 创建索引 删除索引 索引背后的数据结构 B树 B树 事务 事务的本质 事务的特性 并发执行事务产生的问题 脏读问题 不可重复读 幻读 MySQL中隔离级别 read uncommitted readcommitted repeatable read serializable 索引 索引的本质…

SolidUI AI生成可视化,0.1.0版本模块划分以及源码讲解

1.背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…

【Java虚拟机学习1】JVM运行时数据区

JVM运行时数据区 一、前言 我们知道Java程序是运行在JVM&#xff08;Java虚拟机&#xff09;上的&#xff0c;Java程序运行时会占用一定的内存&#xff0c;在虚拟机自动管理机制的帮助下&#xff0c;不再需要为每一个new操作去写配对的delete/free代码&#xff0c;不容易出现…

指针进阶详解(下)

指针进阶详解&#xff08;下&#xff09; 前言1. 函数指针1.1 两端有趣代码 2. 函数指针数组2.1 函数指针数组的用途之一&#xff1a;转移表 3. 指向函数指针数组的指针4. 回调函数5. 结尾 前言 在指针进阶详解&#xff08;上&#xff09;中&#xff0c;我们已经介绍了部分指针…

基于数据安全的风险评估(三):风险分析与评估

完成了资产识别、脆弱性识别及威胁识别后&#xff0c;我们可以采用适当的方法和工具确定威胁利用脆弱性导致安全事件发生的可能性。综合安全事件作用资产价值及脆弱性的严重程度&#xff0c;判断事件造成的损失及对组织的影响&#xff0c;即安全风险。 一 风险计算形式及关键环…

HTTP协议对比HTTPS协议

HTTP协议对比HTTPS协议 1. HTTP协议1.1 概述1.2 HTTP协议格式1.3 HTTP协议支持的方法1.3.1 GET方法1.3.2 POST方法1.3.3 其他HTTP方法1.3.4 GET对比POST 1.4 请求报文1.4.1 Content-Type&#xff1a;请求体中数据格式1.4.2 Cookie&#xff1a;浏览器缓存 1.5 响应报文1.5.1 状态…

LED驱动(原始架构优化:分层/分离)——STM32MP157

文章目录 优化思想&#xff1a;分层Demo的LED驱动程序led_opr.hboard_demo.cleddrv.cledtest.cMakefile编译测试 STM32MP157的LED驱动程序board_stm32mp157.cleddrv.cled_opr.hMakefiel编译测试 优化思想&#xff1a;分离Demo的LED驱动程序led_resource.hboard_A_led.cchip_dem…

MacOS系统(M1/M2)安装AI绘画StableDiffusion保姆级教程

TOC 安装完成后&#xff0c;推荐阅读这篇教程&#xff1a;AI绘画&#xff1a;Stable Diffusion 终极炼丹宝典&#xff1a;从入门到精通 实操环境&#xff1a; macOS 13 Arm64&#xff08;建议12以上的系统使用&#xff09; Apple M1 先来看几个样例&#xff1a; AI绘画S…

goland自定义代码模版

在 GoLand 中我们既可以修改已有代码模版&#xff0c;也可以新建属于我们自己的代码模版&#xff0c;按需配置。 一、修改已有代码模版 现在代码编辑页输入你想更改的代码模版&#xff0c;然后点击右下角的小灯泡按钮&#xff0c;接着选中编辑活动模版设置即可。 二、新建…

[机缘参悟-99] :关于局部最优与全局最优解的人生感悟

在没有获取全局信息之前&#xff0c;要获得全局最优解几乎是不可能的&#xff0c;最多是概率大一点而已&#xff0c;大多数时候&#xff0c;由于时空资源的限制&#xff0c;获得往往是局部最优解&#xff0c;局部最优解&#xff0c;放在全局&#xff0c;往往并非全局最优&#…

数学专题训练3 数论1

1. Problem - 27E - Codeforces 给定 n ( 1 ≤ n ≤ 1000 ) n(1 \le n \le 1000) n(1≤n≤1000)​​​&#xff0c;找到因子个数恰好为 n n n​​​ 个的最小正整数. 保证答案不大于 1 e 18 1e18 1e18. 和 反素数 的思路是一样的&#xff0c;深搜 这个是枚举当前数字可以…

Shiro反序列化漏洞(CVE-2016-4437)+docker靶场+工具利用

一、Shiro反序列化漏洞-CVE-2016-4437原理 将java对象转换为字节序列&#xff08;json/xml&#xff09;的过程叫序列化&#xff0c;将字节序列&#xff08;json/xml&#xff09;恢复为java对象的过程称为反序列化。 Shiro框架提供了“记住我”的功能&#xff0c;用户登陆成功…