请注意,本文编写于 384 天前,最后修改于 225 天前,其中某些信息可能已经过时。
目录
数组
切片
子切片
map
comparable概念
代码演示
channel:这个后面讲并发的时候再讲
数组
语法是:
[CAP] Type
- 初始化要指定长度(或者叫做容量)
- 可以直接初始化
- arr[i]的形式访问元素
- len和cap操作用于获取数组长度
- 使用for range 来循环

切片
语法是: []type
- 直接初始化
- make初始化:make([]type,length,capacity)
- arr[i]的形式访问元素
- append追加元素
- len获取元素数量
- cap获取切片容量
- 推荐写法: s1:=make([]type,0,capacity)
- 使用for range来遍历

数组和切片的区别

如何理解切片?
最直观的对比:ArrayList,即基于数组的list的实现,切片的底层也是数组
跟Array的区别:
- 切片操作是有限的,不支持随机增删(即没有add,delete方法,需要自己写代码)
- 只有append操作
- 切片支持子切片操作,和原本切片是共享底层数组
子切片
数组和切片都可以通过[start
]的形式来获取子切片:
- arr[start],获得[start,end)之间的元素
- arr[],获得[0,end)之间的元素
- arr[start:],获得[start,len(arr))之间的元素。

内存共享问题
核心:共享数组
子切片和切片究竟会不会互相影响,就抓住一点:他们是不是还共享数组?
什么意思?
- 就是如果它们结构没有变化,那肯定是共享的;但是结构变化了,就可能不是共享了。
什么情况下结构会变化? 扩容了
所以,切片与子切片,切片作为参数传递到别的方法、结构体里面,任何情况下你要判断是否内存共享,那么就一点:有没有扩容

map
map是go里面的内置类型之一,使用起来也很简单。

读取元素:有两个返回值
- 第一个是值,第二个是这个元素是否存在
- 如果只有一个返回值,那么就是对应的元素;元素不存在,那么就是对应类型的零值

读取长度:len
- 遍历:for,第一个是key,第二个是value
- 删除:使用delete方法
注意:map的遍历是随机的,也就是你遍历两边,输出的结果都不一样。

comparable概念
- 在Switch里面,值必须是可比较的
- 在map里面,key也必须是可比较的
所谓可比较的,在go里面就是指:GO在编译的时候、运行的时候能够判断出来元素是不相等的。
初学的时候,你就知道:
- 基本类型和string都是可比较的
- 如果元素是客比较的,那么该数据也是可比较的
参考这里的详细说明
面试也基本不可能面到这个内容,你有一个概念就行。
代码演示
- go是强类型语言,能不能设计一个方法,可以计算任意数字类型切片的和的方法?
- func SumInt64([]int64)只能用于int64
- func SumInt32([]int32)只能用于int32
- ……
- 获得map的所有key、所有value
channel:这个后面讲并发的时候再讲
本文作者:Eric
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA
许可协议。转载请注明出处!