09【保姆级】-GO语言的数组和切片

09【保姆级】-GO语言的数组

  • 一、数组
    • 1.1 数组定义
    • 1.2 数组的使用
    • 1.3 数组的遍历
    • 1.4 数组的应用案例
  • 二、切片
    • 2.1 切片的介绍
    • 2.2 切片的原理
    • 2.3 切片的三种使用

之前我学过C、Java、Python语言时总结的经验:

  1. 先建立整体框架,然后再去抠细节。
  2. 先Know how,然后know why。
  3. 先做出来,然后再去一点点研究,才会事半功倍。
  4. 适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。
  5. 对于GO语言,切记遵守语法格式规则。(例如python语言、例如SpringBoot框架等)
    解释:某些知识点,就是很难了解,那么先做出来,然后继续向前学习,可能在某个时间点我们就会恍然大悟。

一、数组

1.1 数组定义

数组可以存放多个同一类型数据。数组也是一种数据类型,在 Go 中,数组是值类型。

初始化的四种方式:

var arr01 [3]int = [3]int{1, 2, 3}
var arr02 = [3]int{1, 2, 3}
var arr03 = [...]int{1, 2, 3}
var arr04 = [...]int{1: 111, 0: 001, 2: 222}
fmt.Println("arr04=", arr04) // arr04= [1 111 222]
// 设置排序顺序

数组的首地址 也就是 数组第一个元素的地址。第二个元素的地址是:首地址+数组类型的占用的字节数。

var arr [5]float64
fmt.Printf("首地址是:%p,首元素地址是:%p,第二个元素的地址是:%p", &arr, &arr[0], &arr[1])
// 首地址是:0xc042076030,首元素地址是:0xc042076030,第二个元素的地址是:0xc042076038

1.2 数组的使用

func main() {
	var arr [5]float64
	arr[0] = 1.2
	arr[1] = 2.2
	arr[2] = 21.2
	arr[3] = 3.2
	arr[4] = 4.2
	num := 0.0
	for i := 0; i < len(arr); i++ {
		num += arr[i]
	}
	fmt.Println("num=", num)  //n um= 32
}

1.3 数组的遍历

方式一常规方式:如上述章节方式

方式二:for-range结构遍历:用来遍历访问数组的元素

for index,value :=range array01{

}
  1. 第一个返回值 index是数组的下标
  2. 第二个value是在该下标位置的值
  3. 他们都是仅在for循环内部可见的局部变量
  4. 遍历数组元素的时候,如果不想使用下标index,可以直接把下标index标为下划线_
  5. index和value 的名称不是固定的,即程序员可以自行指定,一般命名为index 和value
arr := [...]string{"张三", "lisi", "王五", "赵六"}
for i, s := range arr {
	fmt.Println("元素索引是:", i, "元素是:", s)
}
元素索引是: 0 元素是: 张三
元素索引是: 1 元素是: lisi
元素索引是: 2 元素是: 王五
元素索引是: 3 元素是: 赵六

----

arr := [...]string{"张三", "lisi", "王五", "赵六"}
for _, s := range arr {
	fmt.Println("元素是:", s)
}
元素是: 张三
元素是: lisi
元素是: 王五
元素是: 赵六

  1. 数组的下标是从0开始的。
  2. 数组下标必须在指定范围内使用,否则报 panic: 数组越界,比如var arr[5]int 则有效下标为 0-4
  3. Go的数组属值类型,在默认情况下是值传递, 因此会进行值拷贝。数组间不会相互影响
  4. 如想在其它函数中,去修改原来的数组,可以使用引用传递(指针方式)[先体验下,画示意图]
---值传递: 在test栈中会赋值arr的数据
func main() {
	arr := [...]string{"11", "22", "33", "444"}

	testArr(arr)
	fmt.Println(arr) //  [11 22 33 444]
}

func testArr(arr [4]string) {
	arr[0] = "9999"
}

--- 地址传递:在test栈中会直接指向arr数组的数据。
// 所以可以改变数组中的元素
func main() {
	arr := [...]string{"11", "22", "33", "444"}

	testArr(&arr)
	fmt.Println(arr)  //  [9999 22 33 444]
}

func testArr(arr *[4]string) {
	arr[0] = "9999"
}

1.4 数组的应用案例

遍历数组从A加到Z,然后遍历输出:

func main() {

	var arr [26]byte
	for i := 0; i < 26; i++ {
		arr[i] = 'A' + byte(i)
	}
	fmt.Println(arr)
	// [65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90]
	for _, v := range arr {
		fmt.Printf("%c ", v)
	}
	//  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
}

二、切片

个数不确定时,可以使用切片。

2.1 切片的介绍

  1. 切片的英文是 slice
  2. 切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制
  3. 切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度 len(slice)都一样
  4. 切片的长度是可以变化的,因此切片是一个可以动态变化数组。
  5. 切片定义的基本语法
    var 切片名[类型]
    比如: var a I int

2.2 切片的原理

切片是有三部分组成:

  • 指向数组的地址
  • 指向数组的长度
  • 切片的容量长度
    在这里插入图片描述

2.3 切片的三种使用

方式一:创建好的数组,进行切片

func main() {

	var arr [26]byte
	for i := 0; i < 26; i++ {
		arr[i] = 'A' + byte(i)
	}

	for _, v := range arr {
		fmt.Printf("%c ", v)
	}
	fmt.Println()
	//  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

	Myslice := arr[1:10]

	fmt.Printf("遍历Myslice切片元素: %c \n", Myslice) //slice: [66 67 68 69 70 71 72 73 74]
	fmt.Printf("切片的第一个元素:%p, 对应数组的地址是:%p", &Myslice[0], &arr[1])
	// 切片的第一个元素:0xc0420580a1, 对应数组的地址是:0xc0420580a1
}

内置的make来创作切片:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB | 绘图复刻(十三) | 带NaN图例的地图绘制

有粉丝问我地图绘制如何添加NaN&#xff0c;大概像这样&#xff1a; 或者这样&#xff1a; 直接上干货&#xff1a; 原始绘图 假设我们有这样的一张图地图&#xff0c;注意运行本文代码需要去matlab官网下载Mapping Toolbox工具箱&#xff0c;但是其实原理都是相似的&…

在无回显的情况下如何判断是否存在命令注入漏洞

在无回显的情况下如何判断是否存在命令注入漏洞 这种情况下可以使用OOB带外来实现&#xff0c;言而简之&#xff0c;就是利用命令执行漏洞去解析我们的dns如果dns日志有记录那就说明存在命令注入漏洞 首先先简单搭建一个无回显的命令注入 <?phpexec($_REQUEST[777]); ?&…

Vue3 配置全局 scss 变量

variables.scss $color: #0c8ce9;vite.config.ts // 全局css变量css: {preprocessorOptions: {scss: {additionalData: import "/styles/variables.scss";,},},},.vue 文件使用

html2canvas快速使用

一、概述 html2canvas是一个HTML渲染器&#xff0c;是一个脚本&#xff0c;它允许你直接在用户浏览器截取页面或部分网页的“屏幕截屏”。底层是基于DOM的&#xff0c;根据页面上可用的信息构建屏幕截图&#xff0c;它没有制作实际的屏幕截图&#xff0c;因此生成的图片并不一定…

【藏经阁一起读】(77)__《Apache Dubbo3 云原生升级与企业最佳实践》

【藏经阁一起读】&#xff08;77&#xff09; __《Apache Dubbo3 云原生升级与企业最佳实践》 目录 一、Dubbo是什么 二、Dubbo具体提供了哪些核心能力&#xff1f; 三、构建企业级Dubbo微服务 &#xff08;一&#xff09;、创建项目模板 &#xff08;二&#xff09;、将…

部署单仓库多目录项目

部署单仓库多目录项目 文章目录 部署单仓库多目录项目1.部署单仓库多目录项目2.Shell脚本进行部署单仓库多目录项目2.1 编写Shell脚本2.2 Demo推送代码及测试 3.小结 1.部署单仓库多目录项目 #部署单仓库多目录项目 在开发过程中,研发团队往往会将一个大型项目拆分成几个子目录…

4. Pandas行列操作

4.1 新增列 4.1.1 assign Pandas中的assign&#xff08;&#xff09;函数不仅可以实现不改变原数据情况下新增列&#xff0c;而且可以同时新增多列&#xff0c;还可以配合链式操作使用一行代码完成多个新增列创建&#xff0c;使得代码非常整洁。 &#xff08;1&#xff09;函…

HTTP响应详解

HTTP响应格式 HTTP响应报文通常由四个部分组成: 响应行(Response Line):包含协议版本、状态码和状态消息,例如:HTTP/1.1 200 OK。 响应头(Response Headers):包含了一系列的键值对,用来描述关于响应的信息,比如内容类型、日期、服务器信息等等。 空行:即CRLF(回车…

【剑指offer|图解|链表】链表的中间结点 + 链表中倒数第k个结点

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、算法模板 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️链表的中间结点二. ⛳️链表中倒数第k个结点&#x1f4dd;结语 &#x1f4c…

中国毫米波雷达产业分析1——毫米波雷达行业概述

一、毫米波雷达简介 &#xff08;一&#xff09;产品定义 雷达是英文Radar的音译&#xff0c;源于Radio Detection and Ranging的缩写&#xff0c;原意是“无线电探测和测距”&#xff0c;即用无线电方法发现目标并测定它们在空间的位置。毫米波雷达是指一种工作在毫米波频段的…

基于像素特征的kmeas聚类的图像分割方案

kmeans聚类代码 将像素进行聚类&#xff0c;得到每个像素的聚类标签&#xff0c;默认聚类簇数为3 def seg_kmeans(img,clusters3):img_flatimg.reshape((-1,3))# print(img_flat.shape)img_flatnp.float32(img_flat)criteria(cv.TERM_CRITERIA_MAX_ITERcv.TERM_CRITERIA_EPS,2…

环境配置|GitHub——如何在github上搭建自己写的网站

下面简单地总结了从本地的网页文件到在github服务器上展示出来即可以通过网络端打开的过程&#xff1a; &#xff08;以下可能会出现一些难点&#xff0c;照着做就可以了&#xff0c;由于笔者是小白&#xff0c;也不清楚具体原理是什么&#xff0c;希望有一天成为大神的时候能轻…

第一次性能测试懵逼了

最近&#xff0c;公司领导让我做下性能方面的竞品对比&#xff0c;作为一个性能测试小白的我&#xff0c;突然接到这样的任务&#xff0c;下意识发出大大的疑问。 整理好心情&#xff0c;内心想着“领导一定是为了考验我&#xff0c;才给我这个任务的”&#xff0c;开始了这一次…

人工智能时代:深入了解与学以致用的智能科技

目录 前言人工智能的领域1. 医疗健康2. 交通与智能驾驶3. 教育领域4. 金融与人工智能5. 制造业与自动化 人工智能的应用1. 智能手机与语音助手2. 智能家居系统3. 自动驾驶汽车4. 医疗诊断与治疗5. 金融风控与预测分析 对人工智能的看法1. 科技的利弊2. 伦理和隐私问题3. 人工智…

redis的高可用之持久化

1、redis的高可用考虑指标 &#xff08;1&#xff09;正常服务 &#xff08;2&#xff09;数据容量的扩展 &#xff08;3&#xff09;数据的安全性 2、redis实现高可用的四种方式 &#xff08;1&#xff09;持久化 &#xff08;2&#xff09;主从复制 &#xff08;3&…

构建智能医患沟通:陪诊小程序开发实战

在医疗科技的浪潮中&#xff0c;陪诊小程序的开发成为改善医患沟通的创新途径之一。本文将介绍如何使用Node.js和Express框架构建一个简单而强大的陪诊小程序&#xff0c;实现患者导诊和医生咨询功能。 1. 安装Node.js和Express 首先确保已安装Node.js&#xff0c;然后使用以…

【软考】文件的组织结构

目录 一、说明二、逻辑结构2.1 说明2.2 记录式文件2.2.1 说明2.2.2 顺序文件2.2.3 索引文件2.2.4 索引文件 2.3 流式文件 三、物理结构3.1 说明3.2 链接方式之隐式链接3.3 链接方式之显式链接 一、说明 1.组织结构是文件的组织形式。 2.逻辑结构为用户可见的的文件结构。 3.物理…

听GPT 讲Rust源代码--src/librustdoc

题图来自 Why is building a UI in Rust so hard? File: rust/src/librustdoc/core.rs 在Rust中&#xff0c;rust/src/librustdoc/core.rs文件的作用是实现了Rustdoc库的核心功能和数据结构。Rustdoc是一个用于生成Rust文档的工具&#xff0c;它分析Rust源代码&#xff0c;并生…

Shell判断:模式匹配:case(二)

简单的JumpServer 1、需求&#xff1a;工作中&#xff0c;我们需要管理N多个服务器。那么访问服务器就是一件繁琐的事情。通过shell编程&#xff0c;编写跳板程序。当我们需要访问服务器时&#xff0c;看一眼服务器列表名&#xff0c;按一下数字&#xff0c;就登录成功了。 2、…

从Hugging Face上手动下载并加载预训练模型

0. 说明&#xff1a; 从 Hugging Face 上下手动载预训练的蛋白质语言模型&#xff08;以ProstT5为例&#xff09;&#xff0c;用模型中的 encoder 部分对蛋白质进行编码&#xff0c;得到 embedding features&#xff0c;用于下游的任务。 【ps. 除了手动下载之外&#xff0c;…