五、golang基础之slice和map

文章目录

  • 一、slice
    • (一)含义
    • (二)定义切片
    • (三)切片初始化
    • (四)len() 和 cap() 函数
    • (五)空(nil)切片
    • (六)切片截取
    • (七)append() 和 copy() 函数
  • 二、map

一、slice

(一)含义

Go 语言切片是对数组的抽象。

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

(二)定义切片

你可以声明一个未指定大小的数组来定义切片:

var identifier []type;

切片不需要说明长度。

或使用make()函数来创建切片:

var slice1 []type = make([]type,len);
也可以简写为
slice1 := make([]type, len)

也可以指定容量,其中capacity为可选参数。

make([]T,length,capacity);

这里 len 是数组的长度并且也是切片的初始长度。

(三)切片初始化

s :=[] int {1,2,3 }

直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3

s := arr[:]

初始化切片s,是数组arr的引用

s := arr[startIndex:endIndex]

将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片

s := arr[startIndex:]

缺省endIndex时将表示一直到arr的最后一个元素

s := arr[:endIndex]

缺省startIndex时将表示从arr的第一个元素开始

s1 := s[startIndex:endIndex]

通过切片s初始化切片s1

s :=make([]int,len,cap)

通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片

(四)len() 和 cap() 函数

切片是可索引的,并且可以由 len() 方法获取长度。

切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。

以下为具体实例:

package mainimport "fmt"func main() {var numbers = make([]int,3,5)printSlice(numbers)
}func printSlice(x []int){fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

len=3 cap=5 slice=[0 0 0]

(五)空(nil)切片

一个切片在未初始化之前默认为 nil,长度为 0,实例如下:

package mainimport "fmt"func main() {var numbers []intprintSlice(numbers)if(numbers == nil){fmt.Printf("切片是空的")}
}func printSlice(x []int){fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

len=0 cap=0 slice=[]
切片是空的

(六)切片截取

可以通过设置下限及上限来设置截取切片[lower-bound:upper-bound],实例如下:

package mainimport "fmt"func main() {/* 创建切片 */numbers := []int{0,1,2,3,4,5,6,7,8}   printSlice(numbers)/* 打印原始切片 */fmt.Println("numbers ==", numbers)/* 打印子切片从索引1(包含) 到索引4(不包含)*/fmt.Println("numbers[1:4] ==", numbers[1:4])/* 默认下限为 0*/fmt.Println("numbers[:3] ==", numbers[:3])/* 默认上限为 len(s)*/fmt.Println("numbers[4:] ==", numbers[4:])numbers1 := make([]int,0,5)printSlice(numbers1)/* 打印子切片从索引  0(包含) 到索引 2(不包含) */number2 := numbers[:2]printSlice(number2)/* 打印子切片从索引 2(包含) 到索引 5(不包含) */number3 := numbers[2:5]printSlice(number3)}func printSlice(x []int){fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

执行以上代码输出结果为:

len=9 cap=9 slice=[0 1 2 3 4 5 6 7 8]
numbers == [0 1 2 3 4 5 6 7 8]
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
len=0 cap=5 slice=[]
len=2 cap=9 slice=[0 1]
len=3 cap=7 slice=[2 3 4]

(七)append() 和 copy() 函数

如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。

下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法。

package mainimport "fmt"func main() {var numbers []intprintSlice(numbers)/* 允许追加空切片 */numbers = append(numbers, 0)printSlice(numbers)/* 向切片添加一个元素 */numbers = append(numbers, 1)printSlice(numbers)/* 同时添加多个元素 */numbers = append(numbers, 2,3,4)printSlice(numbers)/* 创建切片 numbers1 是之前切片的两倍容量*/numbers1 := make([]int, len(numbers), (cap(numbers))*2)/* 拷贝 numbers 的内容到 numbers1 */copy(numbers1,numbers)printSlice(numbers1)   
}
func printSlice(x []int){fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
len=0 cap=0 slice=[]
len=1 cap=1 slice=[0]
len=2 cap=2 slice=[0 1]
len=5 cap=6 slice=[0 1 2 3 4]
len=5 cap=12 slice=[0 1 2 3 4]

二、map

map和slice类似,只不过是数据结构不同,下面是map的一些声明方式。

package main
import ("fmt"
)func main() {//第一种声明var test1 map[string]string//在使用map前,需要先make,make的作用就是给map分配数据空间test1 = make(map[string]string, 10) test1["one"] = "php"test1["two"] = "golang"test1["three"] = "java"fmt.Println(test1) //map[two:golang three:java one:php]//第二种声明test2 := make(map[string]string)test2["one"] = "php"test2["two"] = "golang"test2["three"] = "java"fmt.Println(test2) //map[one:php two:golang three:java]//第三种声明test3 := map[string]string{"one" : "php","two" : "golang","three" : "java",}fmt.Println(test3) //map[one:php two:golang three:java]language := make(map[string]map[string]string)language["php"] = make(map[string]string, 2)language["php"]["id"] = "1"language["php"]["desc"] = "php是世界上最美的语言"language["golang"] = make(map[string]string, 2)language["golang"]["id"] = "2"language["golang"]["desc"] = "golang抗并发非常good"fmt.Println(language) //map[php:map[id:1 desc:php是世界上最美的语言] golang:map[id:2 desc:golang抗并发非常good]]//增删改查// val, key := language["php"]  //查找是否有php这个子元素// if key {//     fmt.Printf("%v", val)// } else {//     fmt.Printf("no");// }//language["php"]["id"] = "3" //修改了php子元素的id值//language["php"]["nickname"] = "啪啪啪" //增加php元素里的nickname值//delete(language, "php")  //删除了php子元素fmt.Println(language)
}

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

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

相关文章

2024HVV最新POC/EXP,目前有8000+个POC/EXP

点击"仙网攻城狮”关注我们哦~ 不当想研发的渗透人不是好运维 让我们每天进步一点点 简介 都是网上收集的POC和EXP,最新收集时间是2024年五月,需要的自取。 表里没有的可以翻翻之前的文章,资源比较零散没有整合起来。 文件链接&#xff…

hexo博客搭建

系列文章目录 文章目录 系列文章目录前言1. 环境配置2. 打包并发布到github仓库3. 生成ssh秘钥4.vscode配置本地与远端相对路径不一致问题总结 前言 本文主要介绍了hexo博客怎么搭建 1. 环境配置 安装git、nodejs、npm创建博客文件夹blogcmd输入命令npm install -g hexo初始化…

10波形震荡原因及采集设备安装视频

10波形震荡原因及采集设备安装视频 排查过程算法软件后台解码计算嵌入式采集设备准备视频 结语其他以下是废话 之前说过:“解决不了的真的就不是我这边能解决的了”,这是因为我们充分排查了自身,那么问题出在哪里呢? 不愿沟通、不…

Spring Boot 全面解析:从入门到实践案例

引言: Spring Boot 是由 Pivotal 团队提供的全新框架,旨在简化 Spring 应用的初始搭建以及开发过程。它基于 Spring 平台,通过“约定优于配置”的原则,尽可能自动化配置,减少XML配置,使得开发者能够快速启…

矢量数据库:概念、历史、现状与展望?

矢量数据库:概念、历史、现状与展望? 李升伟 概念:矢量数据库是一种专门用于存储、检索和搜索矢量的数据库。在数据科学和机器学习中,矢量是表示数据的有序列表或数字序列,可以表示各种类型的数据,如文本…

阿里云智能编程助手的安装使用

https://help.aliyun.com/document_detail/2590613.html 通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力&a…

前后端防重复提交

数据重复提交是一个大忌,会带来无效数据,应该在前端和后端都建议检测防范。 前端一般是按钮按下触发数据提交,如果用户鼠标操作习惯不好,或者鼠标或系统设置问题会导致鼠标连击,如果前端不做相关处理,可能会…

洞察数据资产的奥秘:深入剖析数据资产在企业运营中的核心作用,提出一套全面、系统的数据资产解决方案,帮助企业实现数据资产的最大化利用和增值

一、引言 在数字化浪潮汹涌的今天,数据已成为企业最宝贵的资产之一。数据资产不仅记录了企业的历史运营轨迹,更蕴含着指导未来决策的智慧。然而,如何有效管理、利用这些数据资产,使其转化为企业的竞争优势和利润增长点&#xff0…

Vue3-04_组件基础_下

props验证 指的是在封装组件时对外界传递过来的 props 数据进行合法性的校验,从而防止数据不合法的问题。 使用数组类型的 props 节点的缺点是无法为每个 prop 指定具体的数据类型。 使用对象类型的 props 节点,可以对每个 prop 进行数据类型的校验&am…

【云服务-5】Elasticsearch

Elasticsearch是什么?和大数据的关系? Elasticsearch 是一个分布式、开源的搜索和分析引擎,建立在 Apache Lucene 库之上。它的主要特点包括: (1)快速、可扩展的搜索和分析能力 (2)支持多租户和高可用性 …

python--基础篇--正则表达式--py脚本--题目解答

文章目录 验证输入用户名和QQ号是否有效并给出对应的提示信息从一段文字中提取出国内手机号码替换字符串中的不良内容拆分长字符串 验证输入用户名和QQ号是否有效并给出对应的提示信息 """ 验证输入用户名和QQ号是否有效并给出对应的提示信息要求:用…

常用数据库简单介绍

1. MySQL 优势: 开源和免费:MySQL 是一个开源数据库,拥有庞大的社区支持,易于获取和使用。性能优秀:对于中小型项目,MySQL 提供了高效的性能和响应速度。跨平台支持:MySQL 可以在各种操作系统…

扎克伯格抨击闭源人工智能竞争对手试图“创造上帝”

Meta 首席执行官马克-扎克伯格(Mark Zuckerberg)在周四发表的一篇访谈中谈到了他对人工智能未来的看法,他深信"不会只有一种人工智能"。扎克伯格强调了开源的价值,即把人工智能工具交到许多人手中,他还不忘贬…

抖音微短剧小程序源码搭建:实现巨量广告数据高效回传

在数字化营销日益盛行的今天,抖音微短剧小程序已成为品牌与观众互动的新渠道。这些短小精悍的剧目不仅能迅速抓住用户的注意力,还能有效提升品牌的知名度和用户黏性。然而,想要充分利用这一营销工具,关键在于如何高效地追踪广告数…

堆的 shift down

堆的 shift down 堆(Heap)是一种特殊的完全二叉树,它通常用于实现优先队列。在堆中,每个节点的值都大于或等于(在最大堆中)或小于或等于(在最小堆中)其子节点的值。堆的操作包括插入元素(shift up)和删除元素(shift down 或 bubble down)。 本文将重点介绍堆的 s…

HDFS EC文件损坏恢复方法

HDFS EC低版本存在许多bug,导致文件损坏,这些bug是在一定的条件下才有机率性的错误重构。 我们当前版本是3.1.1,使用前已修复部署EC patch了,但还是损坏了文件,而且这些文件是无任何提示异常的。是在进行读数据的时候…

从0开始学习pyspark--pyspark的启动模式[第1节]

PySpark是Apache Spark的Python API,它能够在分布式计算环境中处理大规模数据。PySpark可以在几种不同的模式下运行,主要包括以下三种: 本地模式(Local Mode)集群模式(Cluster Mode)客户端模式…

springboot中使用springboot cache

前言&#xff1a;SpringBoot中使用Cache缓存可以提高对缓存的开发效率 此图片是SpringBootCache常用注解 Springboot Cache中常用注解 第一步&#xff1a;引入依赖 <!--缓存--><dependency><groupId>org.springframework.boot</groupId><artifactId…

使用ExpandableListView创建可扩展列表

使用ExpandableListView创建可扩展列表 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何使用Android中的ExpandableListView创建可扩展列…

【linux】gcc快速入门教程

目录 一.gcc简介 二.gcc常用命令 一.gcc简介 gcc 是GNU Compiler Collection&#xff08;GNU编译器套件&#xff09;。就是一个编译器。编译一个源文件的时候可以直接使用&#xff0c;但是源文件数量太多时&#xff0c;就很不方便&#xff0c;于是就出现了make 工具 二.gcc…