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,一经查实,立即删除!

相关文章

在VS中安装chatGPT

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

Linux下的Debugfs

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

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

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

修改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 …

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

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

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

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

AVLTree

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

【数据结构二叉树】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 数…

MoonBit 双周报 Vol.59:新增编译器常量支持,改进未使用警告,支持跨包函数导入...多个关键技术持续优化中!

2024-11-04 MoonBit更新 增加了编译期常量的支持。常量的名字以大写字母开头&#xff0c;用语法 const C ... 声明。常量的类型必须是内建的数字类型或 String。常量可以当作普通的值使用&#xff0c;也可以用于模式匹配。常量的值目前只能是字面量&#xff1a; const MIN_…

HTB:Shocker[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many TCP ports are listening on Shocker? 使用nmap对靶机TCP端口进行开放扫描 2.What is the name of the directory available on the webserver that is a standard name known for running scripts via the Common Gateway Int…

力扣——另一个的子树(C语言)

1.题目&#xff1a; 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree …

【C++】对左值引用右值引用的深入理解(右值引用与移动语义)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 ​ 目录 前言&#xff1a;对引用的底层理解 一、左值与右值 提问&#xff1a;左值在左&#xff0c;右值在右&#xff1f;…

解决 ClickHouse 高可用集群中 VRID 冲突问题:基于 chproxy 和 keepalived 的实践分析

Part1背景描述 近期&#xff0c;我们部署了两套 ClickHouse 生产集群&#xff0c;分别位于同城的两个数据中心。这两套集群的数据保持一致&#xff0c;以便在一个数据中心发生故障时&#xff0c;能够迅速切换应用至另一个数据中心的 ClickHouse 实例&#xff0c;确保服务连续性…

B2C电商平台如何提升转化率 小程序商城如何做好运营

在竞争激烈的电商市场中&#xff0c;提升转化率是每个B2C电商平台的重要目标。转化率直接影响销售业绩和盈利能力&#xff0c;因此&#xff0c;了解如何优化用户体验、增强客户信任和提高购买动机是至关重要的。商淘云分享一些有效的策略&#xff0c;帮助B2C电商平台提升转化率…

RK3568平台开发系列讲解(字符设备驱动篇)Linux设备分类

🚀返回专栏总目录 文章目录 一、字符设备(是以字节为单位进行输入输出)二、块设备:块设备是以块为单位进行输入输出三、网络设备沉淀、分享、成长,让自己和他人都能有所收获!😄 一、字符设备(是以字节为单位进行输入输出) 串口、鼠标 字符设备没有固定的大小,也没…