Array(数组)

数组存放的是固定长度、相同类型的数据。

数组声明

  1. var <数组名> = [<长度>]<元素>{元素1,元素2}

    var arr = [2]int{1,2}

    或者

    arr := [2]int{1,2}

  2. var <数组名> = [...]<元素类型>{元素1,元素2}

    var arr = [...]int{1,2}

    或者

    arr := [...]int{1,2}

  3. var <数组名> = [...]<类型>{索引1:元素1,索引2:元素2}

    var arr = [...]int{1:1,0:2}

    或者

    arr := [...]int{1:1,0:2}

数组的每个元素在内存中都是连续存放的,每个元素都有一个下标,下标从0开始。

数组长度可以省略,会自动根据{}中的元素来进行推导。

没有初始化的索引,默认值是数组类型的零值。

数组循环

for i,v := range array {
fmt.Printf("索引:%d,值:%s\n",i,v)
}
  1. range 表达式返回数组索引赋值给 i,返回数组值赋值给 v。
  2. 如果返回的值用不到,可以用 _ 下划线丢弃:
for _,v:= range array{
fmt.Printf("值:%s\n",i,v)
}

切片

切片和数组类型,可以理解为动态的数组,切片是基于数组实现的,它的底层就是一个数组。对于数组的分割,便可以得到一个切片。

数组生成切片

slice := array[start:end]

array := [5]string{"a","b","c","d","e"}
slice := array[2:5]
fmt.Println(slice) //[c d e]

注意:这里包含索引2,但是不包含索引5的元素,即:左闭右开。

经过切片后,切片的索引范围也改变了。

array[start:end] 中的 start 和 end 都是可以省略的,start 的默认值是 0 ,end 的默认值为数组的长度。

array[:] 等价于 array[0:5]

切片修改

切片的值也可以被修改,这里也可以证明切片的底层是数组。

array := [5]string{"a","b","c","d","e"}
slice := array[2:5] //[c d e]
slice[1] = "f"
fmt.Println(slice) //[c f e]
fmt.Println(array) //[a b c f e]

修改切片,对应的数组值也被修改了,所以证明基于数组的切片,使用的底层数组还是原来的数组,一旦修改切片的元素值,底层数组对应的值也会被修改。

切片声明

使用 make 函数声明切片

//声明一个元素类型为string的切片,长度是4
slice := make([]string,4)
//长度是4,容量是8
slice1 := make([]srting,4,8)

切片的容量不能比切片长度小。

长度就是元素个数。

容量就是切片的空间。

上面实例在内存上划分了一个容量为8的内存空间,但是只是用了4个内存空间,剩余的处于空闲状态。当通过 append 往切片追加元素时,会追加到空闲内存上,剩余空间不足时,会进行扩容。

字面量初始化切片

slice2 := []string{"a","b","c"}
fmt.Println(len(slice2),cap(slice2)) //3 3

Append

append 函数对一个切片进行追加元素:

slice3 := append(slice2,"d")
//追加多个元素
slice3 := append(slice2,"d","f")
//追加一个切片
slice3 := append(slice2,slice...)

小技巧:

在创建新切片时,最好让长度和容量一样,这样追加操作的时候就会生成新的底层数组,从而和原有数组分离,就不会因为公用底层数组导致修改内容的时候影响多个切片。

切片循环

切片循环与数组一样,也是使用 for range 方式。

Map (映射)

map 是一个无序的 k-v 键值对集合。其中 k 必须是相同类型。k 和 v 的类型可以不同。 k 的类型必须支持 == 比较运算符,这样才可以判断它是否存在,并保证唯一

Map 声明初始化

  1. make:

    mapName := make(map[string]int)

  2. 字面量:

    mapName := map[string]int{"无尘":29}

如果不想创建的时候添加键值对,使用空大括号{}即可,切记不能省略。

Map 获取、删除

//添加键值对或更新对应的key的value
mapName["无尘"] = 20
//获取指定key的value
age := mapName["无尘"]

获取不存在的 k-v 键值对时,如果 key 不存在,返回的 value 是该值的零值,所以很多时候,需要先判断 map 中的 key 是否存在。

nameAge := make([string]int)
nameAge["无尘"]=29
age,ok := nameAge["无尘"]
if ok {
fmt.Println(age)
}
  • map 的 [] 操作返回两个值

    • 第一个是 value
    • 第二个是标记该 key 是否存在,存在则为 true

delete()函数进行删除

delete(nameAge,"无尘")

  • delete 有两个参数,一个是map,一个是要删除的 key 。

遍历 Map

nameAge["无尘"] = 29
nameAge["无尘1"] = 30
nameAge["无尘2"] = 31 for k,v := range nameAge{
fmt.Println("key is",k,"value is ",v)
}
  • 对应 map ,for range 返回两个参数,分别是 k 和 v。

小技巧:for range 遍历 map 的时候,若使用一个返回值,则这个返回值是 map 的 key 。

Map 的大小

map 不同于切片,map 只有长度,没有容量。可以使用 len 函数获取 map 大小。

String 和 []byte

字符串也是一个不可变的字节序列,可以直接转为字节切片 []byte :

s:="Hello无尘小生"
bs := []byte(s)

string 不止可以直接转为 []byte,还可以使用 [] 操作符获取指定索引的字节值。

字符串是字节序列,每一个索引对应一个字节,在 UTF8 编码下,一个汉字对应三个字节。

如果把一个汉字当做一个长度计算,可以使用 utf8.RuneCountInString 函数。

for range 遍历时,是按照 unicode 字符进行循环的,一个汉字占一个长度。

Go通关04:正确使用 array、slice 和 map!的更多相关文章

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

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

  2. go 数组(array)、切片(slice)、map、结构体(struct)

    一 数组(array) go语言中的数组是固定长度的.使用前必须指定数组长度. go语言中数组是值类型.如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址. 声明 ...

  3. JS之Array.slice()方法

    1.Array.slice(startIndex,endIndex); 返回由原始数组从startIndex到endIndex-1的元素构成的新数组; startIndex:默认值0,如果startI ...

  4. javascript:Array.slice.call 到Array.prototype.slice.call

    举个从对象到数组的例子: var obj={}; obj[1]=1; obj[2]=2; obj.length=2; var arr =Array.prototype.slice.call(obj); ...

  5. [js] Array.slice和类数组转数组

    a.call(b) 相当于把a方法放到b的原型上(实例私有方法)执行 Array.slice的用途 https://juejin.im/post/5b20b8596fb9a01e8d6a47c0 用法 ...

  6. golang array, slice, string笔记

    本来想写一篇关于golang io的笔记,但是在学习io之前必须了解array, slice, string概念,因此将在下篇写golang io.   array: 数组的长度是该数组类型的一部分, ...

  7. golang的array/slice

    相同点 由相同类型的元素组合构成 元素有序排列,0为第一个元素下标 基本使用方法相同 区别 array声明时需要指定容量大小,而且无法修改 slice可通过append增加元素,当容量不够时,会自动扩 ...

  8. Array.slice(start,end)的用法

    start在start>=0,假设start=0,表示从数组的第一个元素开始截取,start=2,表示从数组的第二个元素开始截取,依次类推. 在start<0时,start=-1表示从倒数 ...

  9. JS - Array.slice 与 Array.splice

    1)Array.slice方法   1.1)接收两个参数:              a:起始下标              b:结束下标   1.2)返回由a(包括)至b(不包括)的元素所组成的数组 ...

  10. Golang高效实践之array、slice、map

    前言 Golang的slice类型为连续同类型数据提供了一个方便并且高效的实现方式.slice的实现是基于array,slice和map一样是类似于指针语义,传递slice和map并不涉及底层数据结构 ...

随机推荐

  1. Spring Boot下的一种导出CSV文件的代码框架

    1.前言 ​ CSV,逗号分隔值(Comma-Separated Values),即为逗号分隔的文本文件.如果值中含有逗号.换行符.制表符(Tab).单引号及双引号,则需要用双引号括起来:如果值中包含 ...

  2. excel VBA中Xldown和xlup用法

    1.Worksheets("Sheet1").Range("A1").End(xlDown).Select     '意思为自A1起,返回从上往下的最后一个非空 ...

  3. Mongo写入安全机制

    写入安全(Write Concern) 是一种客户端设置,用于控制写入的安全级别.默认况下,插入.删除和更新都会一直等待数据库响应(写入是否成功),然后才会继续执行.通常,遇到错误时,客户端会抛出一个 ...

  4. elk 日志收集 filebeat 集群搭建 php业务服务日志 nginx日志 json 7.12版本 ELK 解决方案

    难的不是技术,难的是业务.熟悉业务流程才是最难的. 其实搜索进来的每一个人的需求不一样,希望你能从我的这篇文章里面收获到. 建议还是看官方文档,更全面一些. 一.背景 1,收集nginx  acces ...

  5. CentOS-搭建MinIO集群

    一.基础环境 操作系统:CentOS 7.x Minio在线演示 Minio下载 二.准备工作 2.1.机器资源 192.168.1.101 /data1 192.168.1.102 /data2 1 ...

  6. Prometheus(一):Web服务环境监控

    写在前面 现每个后端的同学的日常都在跟服务(接口)打交道,维护老的比较大单体应用.按业务拆得相对比较细的新服务.无论企业内部用的,面向用户的前端的服务.流量大的有流量小的,有重要的有不那么重要的. 但 ...

  7. Java:Java的堆区、栈区和方法区详解

    Java内存空间理解 堆:堆主要存放Java在运行过程中new出来的对象,凡是通过new生成的对象都存放在堆中,对于堆中的对象生命周期的管理由Java虚拟机的垃圾回收机制GC进行回收和统一管理.类的非 ...

  8. 文末送书四本 | 这篇Java反射机制太经典!不看后悔!

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员. 价值:Java技能,面试经验指导,简历优化,职场规划指导,技能提升方法,讲不完的职场故事,个人成长经 ...

  9. Java初级面试题整理

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员. 我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 1. Java语言有哪些特点 ...

  10. 从零学习SpringSecurity

    一.简介 SpringSecurity是一个功能强大且高度可定制的身份验证和访问控制框架,和spring项目整合更加方便. 二.核心功能 认证(Authentication):指的是验证某个用户能否访 ...