这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
昨天谈到golang的一些特点,今天再来聊聊golang里面的几种基本数据结构
- map
map是一种很多语言,应该说大部分语言里面都有的数据结构,一般我们称之为哈希表,指的是一个提供一个key-value唯一的以hash为底映射的表,通过对key的计算,来获取value的值。golang中的map与其他map不同的是,它没有put和get方法,取而代之的是像数组一样的获取,例如:
m := make(map[int]string)
m[1] = "1"
fmt.Println(m[1])//"1"
与java中的hashmap一样,它也可以指定初始容量,若超过给定容量,则会发生扩容,同时需要注意,map是协程不安全的,如果在多线程场景下使用,需要加锁
另外,似乎很多地方都提到map的存储是随机的,遍历也会获得随机的结果,但我在1.18的使用中并未感觉到,多次遍历都会获得相同的结果,不知道是不是谷歌官方对此在新版本进行了优化
- channel
channel是golang提供的一个用于协程之间进行通信的管道,是golang独有的特性之一(当之前在promela这门冷门语言中也有接触过,是用于模拟协议的),channel 在多并发操作里是属于协程安全的,并且遵循了 FIFO 特性。即先执行读取的 goroutine 会先获取到数据,先发送数据的 goroutine 会先输入数据。
ch := make(chan int)
这里实现了一个channel的创建,这是一个无缓冲的channel,换而言之,若没有输入,则会导致阻塞,它可以实现同步的通信
而有缓冲的channel可以通过初始化容量来进行,当管道中的数超过缓存,则会导致阻塞,它可以实现异步的通信
- slice
slice类似于java中的arraylist,但正如名字所描述,它本质是数列的一个片段,包括了数组的指针,长度以及容量,创建一个新的切片会复用原来的底层数组