Golang学习之---Golang的数组、切片、排序和查找、map(四)

一、数组




二、切片

切片的数据结构是引用类型,切片是一个可以动态变化的数组。var 切片名 []类型

1、切片的三种使用方式

2、切片在内存中的布局--方式一

  • 从上图可以看出:
  • 1、切片的确是一个引用类型
  • 2、切片从底层来讲,其实就是一个数据结构(struct结构体)
    type slice struct {
          ptr *[2]int
          len int
          cap int
    }

3、切片在内存中的布局--方式二(方式三同二)

  • 对上面代码的总结:
  • 1、通过make方式创建切片可以指定切片的大小和容量
  • 2、对于没有给切片赋值的各个元素,就会使用默认值[int,float->0,string->"",bool->false]
  • 3、通过make方式创建的切片对应的数组是由make底层维护的,对外不可见,即只能通过slice去访问各个元素。

4、方式一和方式二/三的区别(面试题)

方式1是直接引用数组,这个数组是事先存在的,程序员可见。
方式2是通过make来创建切片,make也会创建一个数组,但这个数组是由切片在底层进行维护,程序员不可见。make创建切片的示意图:

5、使用细节

  • (4)切片定义完后,还不能使用,因为本身是一个空的。必须让其引用到一个数组或者make一个空间供切片来使用
  • (5)切片可以继续切片。切片是引用类型,不同切片指向的数据空间是一个,因此切片后元素都发生变化
  • (6)用append内置函数,可以对切片进行动态增加

    切片append操作的底层原理分析:
    ① 切片append操作的本质就是对数组扩容
    ②Go底层会创建一个新的数组newArr(按照扩容后大小)
    ③将slice6原来包含的元素拷贝到新的数组newArr,slice6重新引用到新数组newArr,原来的数组被丢弃,等待垃圾回收。
    ④注意:newArr是在底层维护的,程序员不可见。
  • (7)切片的拷贝操作。切片使用copy内置函数完成拷贝。func copy(dst, src []Type) int

    从上图可以看到:
    slice7和slice8的数据空间是独立的,相互不影响。

6、切片和string

string底层是一个byte数组,因此string也可以进行切片处理。内存示意图:

三、排序和查找

1、排序的基本介绍

排序是将一组数据,按照指定的顺序进行排序的过程。
排序的分类:
(1)内部排序:
指将需要处理的所有数据一次性加载到内存中进行排序。包括(交换式排序法、选择式排序法和插入式排序法)
(2)外部排序法
因数据量过大,无法一次性将全部数据加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)
我们以冒泡排序Bubble Sorting为重点:

2、冒泡排序的思路分析

3、代码实现

4、查找的基本介绍

在Go中,常用的查找有2种:(1)顺序查找;(2)二分查找(前提是该数组是有序的)

5、二分查找的思路分析

6、二分查找的代码实现

7、二维数组在内存中的布局

四、map

1、map的基本介绍

map是key-value数据结构,又称为字段或者关联数组。类似其他编程语言的集合。可以动态增长
切片想要动态增长,需要使用append函数

2、map的基本语法

var 变量名 map[keytype] valuetype

2.1、keytype 可以是什么类型?
Golang中map的key可以是很多中数据类型,比如③bool,⑤数组,④string,Ⅰ指针,④Ⅳchan,还可以是Ⅴ接口,⑥结构体,数组(但是这几个基本没人用)。通常用①int,④string
注意:Ⅱslice,Ⅲmap,⑥Ⅵfunction 不可以做key的数据类型,因为这几个没法用 == 来判断。
从上面这几句话可以得出,key通常是用来做 == 判断的。

2.2、valuetype 可以是什么类型?
和keytype基本一样。通常用:数字(整数,浮点数),string,map,struct

3、快速入门


猜你喜欢

转载自blog.csdn.net/qq_37358143/article/details/107367567