Golang

pprof

January 21, 2021
Golang

Profiling 是指在程序执行过程中,收集能够反映程序执行状态的数据。 在软件工程中,性能分析(performance analysis,也称为 profiling), 是以收集程序运行时信息为手段研究程序行为的分析方法,是一种动态程序分析的方法。

...

chan

December 14, 2020
Golang
Chan

Go 语言中最常见的、也是经常被人提及的设计模式就是 —— 不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存。

先入先出

目前的 Channel 收发操作均遵循了先入先出(FIFO)的设计,具体规则如下:

  • 先从 Channel 读取数据的 Goroutine 会先接收到数据;
  • 先向 Channel 发送数据的 Goroutine 会得到先发送数据的权利;
...

map

Golang
Map

粗略的讲,Go 语言中 map 采用的是哈希查找表, 由一个 key 通过哈希函数得到哈希值, 64 位系统中就生成一个 64 bit 的哈希值, 由这个哈希值将 key 对应到不同的桶(bucket)中, 当有多个哈希映射到相同的的桶中时,使用链表解决哈希冲突。

...

reflect

Golang
Reflect

计算机中提到的反射一般是指,程序借助某种手段检查自己结构的一种能力,通常就是借助编程语言中定义的类型(types)。因此,反射是建立在类型系统上的。

...

slice

Golang

slice 的底层数据是数组,slice 是对数组的封装,它描述一个数组的片段。两者都可以通过下标来访问单个元素。 数组是定长的,长度定义好之后,不能再更改。在 Go 中,数组是不常见的,因为其长度是类型的一部分, 限制了它的表达能力,比如 [3]int[4]int 就是不同的类型。 而切片则非常灵活,它可以动态地扩容。切片的类型和长度无关。 数组就是一片连续的内存, slice 实际上是一个结构体,包含三个字段:长度、容量、底层数组。

...

内存模型

Golang

Go 语言的内存模型规定了一个 goroutine 可以看到另外一个 goroutine 修改同一个变量的值的条件, 这类似 java 内存模型中内存可见性问题。当多个 goroutine 并发同时存取同一个数据时候必须把并发的存取的操作顺序化, 在 go 中可以实现操作顺序化的工具有高级的通道(channel)通信和同步原语比如 sync 包中的互斥锁(Mutex)、 读写锁(RWMutex)或者和 sync/atomic 中的原子操作。

...