数组

go语言中数组的特点:

数组的长度是固定的,并且长度也是数组类型的一部分

是值类型,在赋值或者作为参数传递时,会复制整个数组,而不是指针

定义数组的语法:

var arr1 = [5]int{1,2}          // [5]int{1, 2, 0, 0, 0}  未初始化的值,就默认初始化为该类型的默认值

var arr2 = [...]int{1,2,3}      // [3]int{1,2,3}  长度可由初始化的元素个数确定

var arr3 = [5]int{1: 20, 4: 50}  // 可使用索引来初始化,其他值仍然是对应类型的默认值

var arr4 = [2][3]int{{1,2,3}, {2,3,4}}  // 多维数组

数组常用操作

访问数组元素

可以直接使用索引值访问

遍历数组

var arr = [5]string{"hello", "a", "b", "world", "sss"}

// 这里只接收一个值,那这个值就是索引值
for i := range arr {
fmt.Println(arr[i]);
} // 接收两个值,就分别是索引值 和 索引对应的数组值
for i, v := range arr {
fmt.Println(i, v);
}

len 和 cap 方法都可以返回数组长度,即元素数量

Slice - 切片

slice的底层是数组,它通过内部指针和一些相关属性来引用数组片段,所以slice是可以变长的

slice的结构:

struct Slice {
byte* array;
uintgo len;
uintgo cap;
}

切片slice的特点:

  • 引用类型.本身是结构体
  • 属性len表示内部存储的元素数
  • cap表示当前切片的容量
  • 如果属性slice == nil, 那么len, cap 都应该为0
  • 切片可以通过数组来产生,也可以直接创建切片;对切片进行读写,实际上就是操作底层的数组
// 通过数组产出切片
var arr = [8]int{2,3,5,7,4,6,9,10}
var s1 = arr[1:5:6] // 语法 [start: end: max], 此时 len = end - start, cap = max-start // 直接创建切片
var s2 = []int{2,4,7} // 注意这里声明的是切片,"[]"没有数字,go会自动分配底层数组 // 使用make动态创建切片
var s3 = make([]int, 6, 8) // 语法: make([]类型, len, cap); 可以省略cap,此时cap = len // 通过切片创建新切片, 新切片仍然执行原数组
var s4 = s1[1,2,3] // 与从数组产生切片是相似的,不过要注意范围

切片的常用操作

func append([]T, t …T) []T

从函数的签名就可以看出,作用是向切片的尾部添加元素,可以一次添加多个值,返回新的切片,

⼀旦超出原 slice.cap 限制,就会重新分配底层数组,即便原数组并未填满。

s5 := append(s4, 20)
func copy(dst, src []T) int

这个方法将类型为 T 的切片从源地址 src 拷贝到目标地址 dst,覆盖 dst 的相关元素,并且返回拷贝的元素个数。

源地址和目标地址可能会有重叠。拷贝个数是 src 和 dst 的长度最小值。

具体还是得看例子

src := []int{1,2,3,4}
dst := []int{2,3,4}
num := copy(dst, src) // dst=[]int{1,2,3}, num=3 src2 := []int{1,2,3}
dst2 := [2,3,4,5]
num2 := copy(dst2, src2) // dst2=[]int{1,2,3,5}, num2=3 src3 := []int{1,2,4}
dst3 := []int{1,2,3,5}
num3 := copy(dst3, src3) // dst3=[]int{1,2,4,5} num3=3

len()和map()方法分别返回切片中的元素数量 和 切片的容量

map类型

map类型是一种叫哈希表的数据结构,在python中叫字典,还称为关联数组。它是一组无序键值对的集合。给定键可以快速的定位对应的值

特点:

  • 引用类型
  • 键必须是支持相等比较(== !=)的类型,例如: number,string,array,struct等等
  • 值可以是任何类型
  • 它可以动态伸缩,不存在限制

定义语法:

map[keyType]valueType{
key1: value1,
key2: value2,
...
} // eg:
m := map[string]int{
"age": 10,
"month": 12,
"day": 7,
"num": 1, // 这里最后一行必须加上逗号,要不然,就把 "}"放在这个一行
}

还可以使用 make 函数来定义一个map,有助于提升性能。因为事先申请⼀⼤块内存,可避免后续操作时频繁扩张。

语法:

// 这里的 length 是map的初始容量,可以不加,不过在添加元素时会平凡扩张,影响性能
make(map[keyType][valueType][, length])

map类型的基本操作

访问map中的值

可以使用 map[key] 直接访问对应的值

eg:

var m = map[int]string{
1: "hello",
2: "world",
5: "你好",
} // 迭代map
for k := range m {
fmt.Println(m[k]);
} // 还可以直接获得键和值
for k, v := range m {
fmt.Println(k, v)
}

测试键是否存在

我们很多时候都会使用到

// 这里使用了初始化,如果key存在, ok就是true, _接收的第一的参数就是值
// 如果key不存在,ok就是false
if _, ok := m[key]; ok {
//...
}

删除指定键值对

删除键前,还可以先判断键是否存在,如果键不存在会报错

var m = map[int]string{
1: "hello",
2: "world",
5: "你好",
}
delete(m, 1) // 删除键为1的键值对

go语言学习-数组-切片-map的更多相关文章

  1. Go语言学习笔记(三)数组 & 切片 & map

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 数组 Arrays 数组是同一种数据类型的固定长度的序列. 数组是值类型,因此改变副本的值,不会改变本身的值: 当 ...

  2. Go语言学习之4 递归&闭包&数组切片&map&锁

    主要内容: 1. 内置函数.递归函数.闭包2. 数组与切片3. map数据结构4. package介绍 5. 排序相关 1. 内置函数.递归函数.闭包 1)内置函数 (1). close:主要用来关闭 ...

  3. go语言 类型:数组切片

    初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针.数组切片的数据结构可以抽象为以下3个变量: 1.一个指向原生数组的指针: 2.数组切片中的元素个数: 3.数组切 ...

  4. golang(4):函数 & 数组 & 切片 & map & 锁

    内置函数 // 1. close:主要用来关闭channel // 2. len:用来求长度,比如string.array.slice.map.channel // 3. new:用来分配内存,主要用 ...

  5. Dart语言学习(七)Dart Map类型

    映射(Maps)是无序的键值对: 常用属性: keys 获取所有的key值 values 获取所有的value值 isEmpty 是否为空 isNotEmpty 是否不为空 常用方法: remove( ...

  6. R语言学习——数组

    > #数组(array)与矩阵类似,但维度可大于2.可通过array函数构建,形式如下:myarray<-array(vector,dimensions,dimnames)> #其中 ...

  7. go语言学习--map类型的切片

    今天在项目中遇到了一个切片的map,记录下map切片的使用 package main import "fmt" func main() { // Version A: items ...

  8. GO 语言学习笔记--数组切片篇

    1.对于make 数组切片,长度和容量需要理解清楚: 容量表示底层数组的大小,长度是你可以使用的大小: 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否 ...

  9. go语言的 数组、slice、map使用(转)

    golang群 点击加入 go语言的 数组.slice.map使用, 由于网上有很好的说明, 不需要再写了,请看这几篇: Go语言中的 Array, Slice和 Map 深入学习golang五篇,以 ...

随机推荐

  1. Servlet3.0的注解自定义原生Listener监听器实战

    简介:监听器介绍和Servlet3.0的注解自定义原生Listener监听器实战 自定义Listener(常用的监听器 servletContextListener.httpSessionListen ...

  2. linux下mysql 5.7.22 安装

    二进制安装 1.下载https://dev.mysql.com/downloads/mysql/5.6.html#downloads 2.官方文档https://dev.mysql.com/doc/r ...

  3. Java 集合系列0、概述

    概述: Collection 框架中 从最上层的核心主干可以看到:Iterator.Collection.Map 三个接口(拓展思考1)1.Collection 接口:主要包括了集合中的一些常用操作, ...

  4. python中的魔法参数:*args和**kwargs

    python中的魔法参数:*args和**kwargs def foo(*args, **kwargs):print 'args = ', argsprint 'kwargs = ', kwargsp ...

  5. caffe-win10-cifar10另

    上一篇主要以bat形式实现了leveldb形式的cifar10,因为对于shell脚本不甚熟悉,所以这次专门利用.sh调用来实现lmdb形式的cifar10. 1.下载数据 同上一篇. 2.数据转换和 ...

  6. 泰克TDS1000B示波器使用说明

    1.前言 本文主要根据泰克官方网站TDS1000B/TDS2000B使用教程视频进行整理. 2.认识你的示波器 TDS1000B带宽从40MHZ到200MHZ,采样率高达2Gbps

  7. PYTHON-TCP 粘包

    1.TCP的模板代码 收发消息的循环 通讯循环 不断的连接客户端循环 连接循环 判断 用于判断客户端异常退出(抛异常)或close(死循环) 半连接池backlog listen(5) 占用的是内存空 ...

  8. 深度学习Bible学习笔记:第一章 前言

    写在前面:请务必踏踏实实看书,结合笔记或视频来理解学习,任何技术,啃砖头是最扎实最系统的,为避免知识碎片化,切忌抛却书本的学习!!! 一 什么是深度学习 1 关于AI: AI系统必须具备从原始数据提取 ...

  9. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  10. MonologFX最简demo,javafx外用dialog示例

    参考blog:https://blogs.oracle.com/javajungle/entry/monologfx_floss_javafx_dialogs_for /* * To change t ...