Golang--数组、切片、映射

1、数组

1.1 数组类型

var 数组名 [数组大小]数据类型 

package main
import "fmt"func main(){//1、定义一个数组var arr1 [5]intarr1[0] = 100arr1[1] = 200fmt.Println(arr1) //[100 200 0 0 0]
}

1.2 数组的初始化方式

package main
import "fmt"
func main(){//第一种:var arr1 [3]int = [3]int{3,6,9} //指定类型fmt.Println(arr1)//第二种:var arr2 = [3]int{1,4,7} //自动类型推导fmt.Println(arr2)//第三种:var arr3 = [...]int{4,5,6,7} //自动类型推导fmt.Println(arr3)//第四种:var arr4 = [...]int{2:66,0:33,1:99,3:88} //指定下标初始化+自动类型推导fmt.Println(arr4)
}



注意:

  • 定义数组时,声明的长度不同,即使元素的数据类型相同,但整体的数组类型也是不同的,即长度也是属于类型的一部分
  • Go中数组属值类型,在默认情况下是值传递,因此会进行值拷贝,即形参不影响实参
  • 如想在其它函数中,去修改原来的数组,可以使用引用传递(指针方式)
    package main
    import "fmt"func f(arr *[]int){for i := 0; i < len(*arr); i++ {(*arr)[i] += 10}
    }func main(){var arr []int = []int{1,2,3,4,5,6,7,8,9,0}f(&arr)fmt.Println(arr) //[11 12 13 14 15 16 17 18 19 10]
    }

1.3 数组内存

package main
import "fmt"
func main(){//声明数组:var arr [3]int16//获取数组的长度:fmt.Println(len(arr))//打印数组:fmt.Println(arr)//[0 0 0]//证明arr中存储的是地址值:fmt.Printf("arr的地址为:%p",&arr)//第一个空间的地址:fmt.Printf("arr的地址为:%p",&arr[0])//第二个空间的地址:fmt.Printf("arr的地址为:%p",&arr[1])//第三个空间的地址:fmt.Printf("arr的地址为:%p",&arr[2])
}

注意:数组每个空间占用的字节数取决于数组类型
数组优点:可以通过[]下标进行线性访问

1.4 数组遍历

1、使用普通for循环

2、使用for-range循环 (key - value)

package main
import "fmt"func main(){var arr1 = [...]int{1,2,3,4,5,6,7,8,9,10}//普通for循环遍历for i := 0; i < len(arr1); i++{arr1[i] += 10fmt.Println(arr1[i]) //11 12 13 14 15 16 17 18 19 20}fmt.Println("")//for-range遍历for k,v := range arr1{v += 10 //v只是一个副本,对v的修改不会影响arr1的元素fmt.Println(arr1[k]) //11 12 13 14 15 16 17 18 19 20}fmt.Println("")
}

注意:使用for-range时,接收的value变量只是一个副本,副本改变不影响原来arr1数组的元素

 

1.5 二维数组/多维数组

定义:

package main
import "fmt"func main(){//定义二维数组var arr [3][4]int = [3][4]int{{1,2,3,4},{5,6,7,8},{9,10,11,12}}//遍历二维数组for i := 0; i < len(arr); i++ {for j := 0; j < len(arr[i]); j++ {fmt.Printf("%d ",arr[i][j]) //1 2 3 4 5 6 7 8 9 10 11 12}}fmt.Println("")//定义多维数组var arr2 [3][2][2][2]int = [3][2][2][2]int{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}},{{{17,18},{19,20}},{{21,22},{23,24}}}}//遍历多维数组for i := 0; i < len(arr2); i++ {for j := 0; j < len(arr2[i]); j++ {for k := 0; k < len(arr2[i][j]); k++ {for l := 0; l < len(arr2[i][j][k]); l++ {fmt.Printf("%d ",arr2[i][j][k][l]) //1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24}}}}
}
package main
import "fmt"func main(){//定义二维数组var arr [3][4]int = [3][4]int{{1,2,3,4},{5,6,7,8},{9,10,11,12}}//遍历二维数组for k1,v1 := range arr{for k2,v2 := range v1{fmt.Printf("arr[%v][%v] = %v\n",k1,k2,v2)}}//定义多维数组var arr2 [2][2][2][2]int = [2][2][2][2]int{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}//遍历多维数组for k1,v1 := range arr2{for k2,v2 := range v1{for k3,v3 := range v2{fmt.Printf("arr2[%v][%v][%v] = %v\n",k1,k2,k3,v3)}}}
}

 

2、切片

2.1 切片

  • 切片(slice)是golang中一种特有的数据类型
  • 数组有特定的用处,但数组长度固定不可变,所以在 Go 语言的代码里并不是特别常见。相对的切片却是随处可见的,切片是一种建立在数组类型之上的抽象,它构建在数组之上并且提供更强大的能力和便捷。
  • 切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。

切片的语法:
var 切片名 []类型 = 数组的一个片段引用

2.2  切片的内存分析

切片有3个字段的数据:

  • 一个是指向底层数组的指针
  • 一个是切片的长度
  • 一个是切片的容量

 

2.3 切片的定义

方式1:定义一个切片,然后让切片去引用一个已经创建好的数组
方式2:通过make内置函数来创建切片。基本语法: var切片名[type = make([], len,[cap])
(make底层创建一个数组,对外不可见,所以不可以直接操作这个数组,要通过slice去间接的访问各个元素,不可以直接对数组进行维护/操作)
方式3:定一个切片,直接就指定具体数组,使用原理类似make的方式。

注意:
切片定义后不可以直接使用,需要让其引用到一个数组,或者make一个空间供切片来使用
不能越界

package main
import "fmt"func main(){//方式一:定义一个切片,然后让切片去引用一个已经创建好的数组。var arr [5]int = [5]int{1,2,3,4,5}var slice []intslice = arr[1:3]fmt.Println(slice)//方式二:通过make内置函数来创建切片。基本语法: var切片名[type = make([], len,[cap])// make函数的三个参数:1、切片类型;2、切片的长度;3、切片的容量。slice1 := make([]int, 5, 10)fmt.Println(slice1)fmt.Println(slice1[6])//方式三:定义一个切片,直接就指定具体数组。使用原理类似make的方式。slice2 := []int{1,2,3,4,5}fmt.Println(slice2)
}

 简写方式:

var slice = arr[0:end]  ----> var slice = arr[:end]                //从起始到指定位置

var slice = arr[start:len(arr)]  ---->  var slice = arr[start:]   //从指定位置到末尾

var slice = arr[0:len(arr)]   ----> var slice = arr[:]               //从起始位置到末尾位置

可以对切片继续切片:

package main
import "fmt"func main(){var arr [5]int = [5]int{0,1,2,3,4}var slice1 []int = arr[:3]var slice2 []int = slice1[1:2]slice2[0] = 100fmt.Println(arr) //[0 100 2 3 4]fmt.Println(slice1) //[0 100 2]fmt.Println(slice2) //[100]
}

2.4 切片的遍历

package main
import "fmt"func main(){//定义一个切片slice := []int{1,2,3,4,5}//方式一:forfor i := 0; i < len(slice); i++ {fmt.Println(slice[i]) //1 2 3 4 5}//方式二:for-rangefor _,v := range slice{fmt.Println(v) //1 2 3 4 5}
}

 

2.5 切片的动态增长

package main
import "fmt"func main(){var arr [5]int = [5]int{0,1,2,3,4}slice := arr[2:]fmt.Println(slice) //[2 3 4 0 0]slice = append(slice, 1,2,3,4)fmt.Println(slice) //[2 3 4 1 2 3 4]slice1 := append(slice,100,200,300)fmt.Println(slice1) //[2 3 4 1 2 3 4 100 200 300]
}
package main
import "fmt"
func main(){//定义数组:var intarr [6]int = [6]int{1,4,7,3,6,9}//定义切片:var slice []int = intarr[1:4] //4,7,3fmt.Println(len(slice))slice2 := append(slice,88,50)fmt.Println(slice2) //[4 7 3 88 50]fmt.Println(slice)//底层原理://1.底层追加元素的时候对数组进行扩容,老数组扩容为新数组://2.创建一个新数组,将老数组中的4,7,3复制到新数组中,在新数组中追加88,50//3.slice2 底层数组的指向 指向的是新数组 //4.往往我们在使用追加的时候其实想要做的效果给slice追加:slice = append(slice,88,50)fmt.Println(slice)//5.底层的新数组 不能直接维护,需要通过切片间接维护操作。
}


可以通过append函数将切片追加给切片:

 

2.6 切片的拷贝

使用函数:copy(目标切片,源切片)

package main
import "fmt"
func main(){//定义切片:var a []int = []int{1,4,7,3,6,9}var b []int = make([]int,10)//拷贝:copy(b,a) //将a中对应数组中元素内容复制到b中对应的数组中fmt.Println(b) //[1 4 7 3 6 9 0 0 0 0]
}

3、映射

映射(map), Go语言中内置的一种类型,它将键值对相关联,我们可以通过键 key来获取对应的值value。 
 

3.1 语法

语法:var 变量名 map[keytype]valuetype


注意:key、value的类型:bool、数字、string、指针、channel 、还可以是只包含前面几个类型的接口、结构体、数组,key不可以是slice、map、function


特点:

  • map集合在使用前一定要make
  • map的key-value是无序的
  • key是不可以重复的,如果遇到重复,后一个value会替换前一个value
  • value可以重复的

3.2 创建方式

package main
import "fmt"
func main(){//方式1://定义map变量:var a map[int]string//只声明map内存是没有分配空间//必须通过make函数进行初始化,才会分配空间:a = make(map[int]string,10) //map可以存放10个键值对//将键值对存入map中:a[20095452] = "张三"a[20095387] = "李四"//输出集合fmt.Println(a)//方式2:b := make(map[int]string)b[20095452] = "张三"b[20095387] = "李四"fmt.Println(b)//方式3:c := map[int]string{20095452 : "张三",20098765 : "李四",}c[20095387] = "王五"fmt.Println(c)
}

3.3 map的操作

增加和更新操作:

map["key"]= value , 如果key还没有,就是增加,如果key存在就是修改。

删除操作:
delete(map,"key") , delete是一个内置函数,如果key存在,就删除该key-value,如果key不存在,不操作,但是也不会报错

清空操作:

如果我们要删除map的所有key ,没有一个专门的方法一次删除,可以遍历一下key,逐个删除

或者map = make(...),make一个新的,让原来的成为垃圾,被gc回收

查找操作:

value ,bool = map[key]

value为返回的value,bool为是否返回 ,要么true 要么false 

package main
import "fmt"
func main(){//定义mapb := make(map[int]string)//增加:b[20095452] = "张三"b[20095387] = "李四"//修改:b[20095452] = "王五"//删除:delete(b,20095387)delete(b,20089546)fmt.Println(b)//查找:value,flag := b[200]fmt.Println(value)fmt.Println(flag)
}

 获取长度:len函数

 遍历:for-range

package main
import "fmt"
func main(){//定义map变量//make5个键值对var mp map[string]string = make(map[string]string,5)mp["string"] = "字符串"mp["int"] = "整型"mp["float"] = "浮点型"mp["bool"] = "布尔型"mp["array"] = "数组"//遍历mapfor k,v := range mp{fmt.Printf("key = %v,value = %v\n",k,v)}
}

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

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

相关文章

windows查看net网络监听端口命令和工具(ipconfig、netstat、tasklist、TCPView)

文章目录 使用命令提示符(CMD)查看网络连接和配置使用 netstat 命令查看监听端口查看特定的端口查看TCP监听端口tasklist查看对应进程ID的程序Get-NetTCPConnection 命令使用 TCPView工具使用命令提示符(CMD) 查看网络连接和配置 ipconfig :显示所有网络 适配器的当前 TC…

在VS中安装chatGPT

2、在VSCode中打开插件窗口 3、输入ChatGPT 4、这里有个ChatGPT中文版&#xff0c;就它了 5、安装 6、这时候侧边栏多了一个chatGPT分页图标&#xff0c;点击它 7、打个招呼 8、好像不行 9、看一下细节描述 10、根据要求按下按下快捷键 Ctrl Shift P 11、切换成国内模式 12、…

写了个建表语句 review 的 prompt

初衷 作为一个所谓的 “项目负责人”&#xff0c;我的工作之一&#xff0c;就是 review 大家提交的建表语句。 但大多数情况下&#xff0c;我发现提交的 sql 中包含了大量明显的 “低级问题”。 之所以说低级&#xff0c;并不是我傲慢无礼&#xff0c;而是大多数这些明显的需…

Linux下的Debugfs

debugfs 1. 简介 类似sysfs、procfs&#xff0c;debugfs 也是一种内存文件系统。不过不同于sysfs一个kobject对应一个文件&#xff0c;procfs和进程相关的特性&#xff0c;debugfs的灵活度很大&#xff0c;可以根据需求对指定的变量进行导出并提供读写接口。debugfs又是一个Li…

go 包管理

Go语言所依赖的所有的第三方库都放在GOPATH目录下面 gomodule是Go语言默认的依赖管理工具 Modules是相关Go包的集合&#xff0c;是源代码交换和版本控制的单元&#xff0c;用于指定使用哪些源文件 GO111MODULEoff禁用gomodule&#xff0c;编译时从GOPATH和vendor文件夹中查找包…

Fooocus图像生成软件本地部署教程:在Windows上快速上手AI创作

文章目录 前言1. 本地部署Fooocus图像生成软件1.1 安装方式1.2 功能介绍 2. 公网远程访问Fooocus3. 固定Fooocus公网地址 前言 本篇文章将介绍如何在本地Windows11电脑部署开源AI生图软件Fooocus&#xff0c;并结合Cpolar内网穿透工具轻松实现公网环境远程访问与使用。 Foooc…

Linux高阶——1103——Signal信号机制

1、信号机制 在linux和unix系统下&#xff0c;如果想要处置(挂起&#xff0c;结束)进程&#xff0c;可以使用信号&#xff0c;经典消息机制&#xff0c;所以进程包括系统进程都是利用信号处置进程的 kill -l——查看所有系统支持的信号 1-31号信号——Unix经典信号&#xff…

修改HarmonyOS鸿蒙图标和名字,打包后安装到真机,应用图标丢失变成透明,修改名字也不生效,还是默认的labeL解决方案教程

HarmonyOS鸿蒙打包hap 安装应用到桌面没有图标&#xff0c;用hdc安装到真机&#xff0c;打包后应用图标丢失变成透明&#xff0c;名字也还是默认的label的bug&#xff0c;以下是解决方案 以下是修改方案&#xff1a; 1、修改应用名字&#xff1a; 2、修改应用图标&#xff1a…

Python小游戏20——超级玛丽

首先&#xff0c;你需要确保你的Python环境中安装了pygame库。如果还没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; bash pip install pygame 运行效果展示 代码展示 python import pygame import sys # 初始化pygame pygame.init() # 设置屏幕尺寸 screen_width …

CTF-WEB: python模板注入

漏洞是如何产生的&#xff1f; Python模板注入漏洞通常出现在使用模板引擎生成动态内容的应用中。如果用户输入没有经过适当的处理直接插入模板中&#xff0c;就可能会导致模板注入漏洞。一个常见的例子是使用Jinja2模板引擎时&#xff0c;如果直接渲染用户输入&#xff0c;则…

从富文本窥探苹果的代码秘密

从富文本窥探苹果的代码秘密 背景 在我们的业务场景下&#xff0c;为突出诸如 “利益点”和“利率” 等特性以推动订单成交&#xff0c;引入了 “富文本” 这一概念。富文本具备丰富格式的文本展示与编辑功能。然而&#xff0c;恰是由于富文本具有 “多样式”“复杂排版” 等特…

spark集群模式-standalone的配置和使用

其中所需要的python和spark的软件在该文章中 spark-本地模式的配置和简单使用-CSDN博客 环境配置 首先在别的服务器上均要进行python环境的配置 安装spark 1、上传&#xff0c;解压&#xff0c;重命名 tar -zxvf /opt/install/spark-3.1.2-bin-hadoop3.2.tgz -C /opt/modu…

openstack之guardian介绍与实例创建过程

运行特征 采集模块&#xff1a;扩展Ceilometer&#xff0c;采集存储网、业务网连通性、nova目录是否可读写&#xff1b; 收集模块&#xff1a;将采集到的数据存储到数据库中&#xff1b; 分析模块&#xff1a;根据采集的结果&#xff0c;分析各节点状态&#xff0c;并进行反向检…

AVLTree

1.AVL树的概念 二叉搜索树虽然可以提高查找的效率&#xff0c;但是如果数据有序或者接近有序&#xff0c;二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。为了解决该问题&#xff0c;于是就有了AVLTree。即当向二叉搜索树中插入…

使用 async/await 时未捕获异常的问题及解决方案

使用 async/await 时未捕获异常的问题及解决方案 1. 引言 在现代 JavaScript 开发中&#xff0c;async/await 是处理异步操作的强大工具&#xff0c;它使得异步代码看起来更像同步代码&#xff0c;提升了代码的可读性和可维护性。然而&#xff0c;在使用 async/await 时&…

【数据结构二叉树】C非递归算法实现二叉树的先序、中序、后序遍历

引言: 遍历二叉树&#xff1a;指按某条搜索路径巡访二叉树中每个结点&#xff0c;使得每个结点均被访问一次&#xff0c;而且仅被访问一次。 除了层次遍历外&#xff0c;二叉树有三个重要的遍历方法&#xff1a;先序遍历、中序遍历、后序遍历。 1、递归算法实现先序、中序、后…

深入学习 Scrapy 框架:从入门到精通的全面指南

深入学习 Scrapy 框架&#xff1a;从入门到精通的全面指南 引言 在数据驱动的时代&#xff0c;网络爬虫成为了获取信息的重要工具。Scrapy 是一个强大的 Python 爬虫框架&#xff0c;专为快速高效地提取网页数据而设计。本文将深入探讨 Scrapy 的使用&#xff0c;从基础知识到…

蓝桥杯 区间移位--二分、枚举

题目 代码 #include <stdio.h> #include <string.h> #include <vector> #include <algorithm> #include <iostream> using namespace std; struct node{ int a,b; }; vector<node> q; bool cmp(node x,node y){ return x.b <…

SpringBoot+VUE2完成WebSocket聊天(数据入库)

下载依赖 <!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- MybatisPlus --><dependency><groupId>com.ba…

图文深入介绍Oracle DB link(一)

1. 引言&#xff1a; 本文图文深入介绍Oracle DB link&#xff0c;先介绍基本概念。 2.DB link的定义 数据库链接&#xff08;Database Link&#xff0c;简称 DB Link&#xff09;是 Oracle 数据库中的一个重要功能。它是一种在一个 Oracle 数据库实例中访问另一个 Oracle 数…