编辑
2024-05-31
🧰语言-go
00
请注意,本文编写于 384 天前,最后修改于 225 天前,其中某些信息可能已经过时。

目录

数组
切片
子切片
map
comparable概念
代码演示
channel:这个后面讲并发的时候再讲

数组

语法是: [CAP] Type

  1. 初始化要指定长度(或者叫做容量)
  2. 可以直接初始化
  3. arr[i]的形式访问元素
  4. len和cap操作用于获取数组长度
  5. 使用for range 来循环

image.png

切片

语法是: []type

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

image.png


数组和切片的区别

image.png

如何理解切片?

最直观的对比:ArrayList,即基于数组的list的实现,切片的底层也是数组

跟Array的区别:

  1. 切片操作是有限的,不支持随机增删(即没有add,delete方法,需要自己写代码)
  2. 只有append操作
  3. 切片支持子切片操作,和原本切片是共享底层数组

子切片

数组和切片都可以通过[start

]的形式来获取子切片:

  1. arr[start
    ],获得[start,end)之间的元素
  2. arr[
    ],获得[0,end)之间的元素
  3. arr[start:],获得[start,len(arr))之间的元素。

image.png

内存共享问题

核心:共享数组

子切片和切片究竟会不会互相影响,就抓住一点:他们是不是还共享数组?

什么意思?

  1. 就是如果它们结构没有变化,那肯定是共享的;但是结构变化了,就可能不是共享了。

什么情况下结构会变化? 扩容了

所以,切片与子切片,切片作为参数传递到别的方法、结构体里面,任何情况下你要判断是否内存共享,那么就一点:有没有扩容

image.png

map

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

  • 初始化

    • make方法:记得预估容量
    • 直接初始化元素
  • 赋值:使用中括号

image.png

读取元素:有两个返回值

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

image.png

读取长度:len

  • 遍历:for,第一个是key,第二个是value
  • 删除:使用delete方法

注意:map的遍历是随机的,也就是你遍历两边,输出的结果都不一样。

image.png

comparable概念

  • 在Switch里面,值必须是可比较的
  • 在map里面,key也必须是可比较的

所谓可比较的,在go里面就是指:GO在编译的时候、运行的时候能够判断出来元素是不相等的。

初学的时候,你就知道:

  • 基本类型和string都是可比较的
  • 如果元素是客比较的,那么该数据也是可比较的

参考这里的详细说明

面试也基本不可能面到这个内容,你有一个概念就行。

代码演示

  1. go是强类型语言,能不能设计一个方法,可以计算任意数字类型切片的和的方法?
    • func SumInt64([]int64)只能用于int64
    • func SumInt32([]int32)只能用于int32
    • ……
  2. 获得map的所有key、所有value

channel:这个后面讲并发的时候再讲

本文作者:Eric

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!