【Go】Go基础(六):数组、切片slice、映射map
1、数组
1.1 数组定义
数组:数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列。
数组长度必须是一个常量表达式,并且必须是一个非负整数。数组长度也是数组类型的一部分,所以[5]int和[10]int是属于不同类型的。数组长度最大为 2Gb
1.2 遍历
方法一:
for i:=0; i < len(arr1); i++ {
arr1[i] = …
}
方法二:
for i,_:= range arr1 {
arr1[i] = …
}
2、切片
2.1 切片定义
切片:切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型)。
这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。
切片是一个 长度可变的数组。
2.2 切片常用函数
len():获取切片长度
cap():获取切片可以设置的最大长度,它等于切片的长度 + 数组除切片之外的长度,0 <= len(s) <= cap(s)
2.3 切片声明:
var slice1 []type
2.4 切片初始化:
var slice1 []type = arr1[start:end]
var slice1 []type = arr1[:]
var slice1 []type = make([]type, len)
slice1 := make([]type, len)
2.5 bytes 包
定义长度可变的buffervar buffer bytes.Buffer
或者使用new分配var r *bytes.Buffer = new(bytes.Buffer)
2.6 For-range 结构
for i, value := range slice1 {...
}
2.7 切片重组(reslice)
slice1 := make([]type, start_length, capacity)
其中 start_length 作为切片初始长度而 capacity 作为相关数组的长度。
2.8 切片的复制与追加
copy函数:切片复制
append函数:切片追加
2.9 字符串、数组和切片的应用
从字符串生成字节切片:
c := []byte(s)
copy(dst []byte, src string)
r := []rune(s) //类型为 rune 的切片存储Unicode字符串
字符串:
* 一个字符串实际上是一个双字结构,即一个指向实际数据的指针和记录字符串长度的整数
* Go 语言中的字符串是不可修改
修改字符串中的某个字符:
先将字符串转换成字节数组,然后再通过修改数组中的元素值来达到修改字符串的目的,最后将字节数组转换回字符串格式。
s := “hello”
c := []byte(s)
c[0] = ‘c’
s2 := string© // s2 == “cello”
sort 包:搜索及排序切片和数组:
* sort.Ints(arri):对int类型的切片做升序排序
* IntsAreSorted(a []int) bool:是否已经排序
* func SearchInts(a []int, n int) int:搜索,必须先排好序再搜索
* func Float64s(a []float64) :排序float64
* func Strings(a []string):排序字符串
append 函数常见操作:
* 将切片 b 的元素追加到切片 a 之后:a = append(a, b...)
* 复制切片 a 的元素到新的切片 b 上:b = make([]T, len(a)); copy(b, a)
* 删除位于索引 i 的元素:a = append(a[:i], a[i+1:]...)
*切除切片 a 中从索引 i 至 j 位置的元素:a = append(a[:i], a[j:]...)
* 为切片 a 扩展 j 个元素长度:a = append(a, make([]T, j)...)
* 在索引 i 的位置插入元素 x:a = append(a[:i], append([]T{x}, a[i:]...)...)
* 在索引 i 的位置插入长度为 j 的新切片:a = append(a[:i], append(make([]T, j), a[i:]...)...)
* 在索引 i 的位置插入切片 b 的所有元素:a = append(a[:i], append(b, a[i:]...)...)
* 取出位于切片 a 最末尾的元素 x:x, a = a[len(a)-1], a[:len(a)-1]
* 将元素 x 追加到切片 a:a = append(a, x)
3、map
3.1 map定义
map 是一种元素对(pair)的无序集合;
3.2 声明:
var map1 map[keytype]valuetype
var map1 map[string]int
注意:
key 可以是任意可以用 == 或者 != 操作符比较的类型,比如 string、int、float。所以数组、切片和结构体不能作为 key
3.3 初始化:
map 是引用类型的;内存用 make 方法来分配,永远不要使用 new 来构造 map;
map 的初始化:var map1 = make(map[keytype]valuetype)。
或者简写为:map1 := make(map[keytype]valuetype)。
3.4 测试和删除
测试键值是否存在
map返回两个值,后一值类型为bool表示,键值是否存在
if _, ok := map1[key1]; ok {// ...
}
删除键值:delete(map1, key1)
3.5 可以使用 for 循环构造 map:
for key, value := range map1 {...
}
【Go】Go基础(六):数组、切片slice、映射map相关推荐
- js中数据结构数组Array、映射Map、集合Set、对象、JSON
全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js中数据结构 js中原生自带的数据结构比较简单,主要有数组Array.映射Map.集合Set.我们可以根据这三个基本数据结构实 ...
- 元组Tuple、数组Array、映射Map
一.元组Tuple 元组Tuple是不同类型的值的聚集,元组的值将单个的值包含在圆括号中来构成,元组可以包含一个不同类型的元素 如 val riple = (100, "Scala" ...
- numpy基础——对数组切片操作
创建 首先创建一个多维数组: a = numpy.arange(24).reshape((2,3,4)) print(a) 结果是: [[[ 0 1 2 3] [ 4 5 6 7] ...
- golang 判断 数组 切片 是否为空
实例: package mainfunc main() {// 数组arr := [0]int{}if len(arr) == 0 {println(`这是个空数组`)}// 切片slice := m ...
- Numpy学习笔记三——数组切片、bool索引、掩码和花哨索引
Numpy数组切片.bool索引.掩码和花哨索引 数组切片(slice) 数组切片的公式为 my_array[start: end: step, start: end: step] #示例1: imp ...
- Go开发 之 容器(数组Array、切片slice、映射map、列表list)
文章目录 0.唠唠叨叨 1.数组-Array 1.1.什么是数组 1.1.1.数组的声明 1.1.2.比较两个数组是否相等 1.1.3.示例 1.1.3.1.通过索引下标访问元素 1.1.3.2.数组 ...
- go语言基础数据结构学习---- 数组, 列表(list)和切片(slice)
go语言基础数据结构学习–> 数组, 列表(list)和切片(slice) go 语言中的 数组是类型相同的元素的集合, 列表是双链表的容器, 可以添加不同类型的数据切片是对现有数组的引用, 比 ...
- Golang的数组、切片、映射的理解
1.数组 go的数组是值类型,赋值和传参操作都会复制整个数组数据,因此一般使用指针在函数间传递大数组. 如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推 ...
- 卷毛0基础学习Golang-基础-slice切片
卷毛0基础学习Golang-基础-slice切片 持续更新中---- 切片简述 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数据结构无法完全满足开发者的真实需求. ...
- go数组Array和切片Slice全面简述理解
小聊:本文是小白刚学习 golang 时候的总结,在基本学习了解之上的特性比较与讨论,go的数组有什么不同?切片又有什么好处?怎么去区分它们的使用?外加一些知识的拓展,有利于加深对 go 的 Arra ...
最新文章
- 航空机票预订c#代码_航空公司座位预订问题的C ++程序
- window访问不到linux的activemq_springboot整合开源项目测试拦截接口访问的频率
- python判断_python的判断
- 在线求CR,你觉得我这段Java代码还有优化的空间吗?
- py2exe使用方法 (含一些调试技巧,如压缩email 类)(转)
- ABAQUS中的非线性分析
- Arch 定制化安装与美化
- matlab卡住了 打不开,win7系统matlab打不开无法运行的解决方法
- 谁说大专生不能够学好Java呢?照着这个路线走,高中生都可以!
- java电子配件公司仓库管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
- 算24点我的算法分享
- 黑马程序员rocketmq第一章
- 任意分布的随机数的产生方法
- 纯css修改图标颜色的五种方式
- C语言中的运算符及优先级
- 刷机升级Android版本,ROM之家简析:Android手机系统怎么升级
- 王振堂:今年收购PC厂商 宏碁要超联想成老三
- WORD点击索引目录提示错误信息
- linux log rotation日志滚动详解
- PostgreSQL表的查询(难度适中)
热门文章
- AI视频行为分析系统项目复盘——技术篇3:tensorRT技术梳理
- 深度学习(7)卷积神经网络
- MySQL拦截器获取xml id_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...
- c++ to_string用法
- fflush(stdin)和fflush(stdout)和rewind(stdin)的区别和作用
- Udacity机器人软件工程师课程笔记(十四)-运动学-正向运动学和反向运动学(其一)
- 【只需4步】windows server系统下快速安装绿色版apache-tomcat-8.0.35(免安装版)
- 使用git更新github上的开源项目
- c# .netframwork 4.0 调用 2.0时报错 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
- bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP