淦 Blog

我干了什么 究竟拿了时间换了什么

Golang并发控制

context 为什么需要context 在context之前,要管理协程退出需要借助通道close的机制,该机制会唤醒所有监听该通道的协程,并触发相应的退出逻辑。 为了能够优雅地管理协程的退出,特别是多个协程甚至网络服务之间的退出,Go引入了context包。 context使用方式 context接口详解 context.Context其实是一个接口,提供了以下4种方法: 1 2 3 ...

Golang哈希Map

map又被称为哈希表,是使用频率极高的一种数据结构。哈希表的原理是将多个键/值(key/value) 对分散存储在buckets (桶)中。给定一个键(key), 哈希(Hash) 算法会计算出键值对存储的位置。 哈希碰撞与解决方法 Go语言中的哈希表采用的是开放寻址法中的线性探测(Linear Probing)策略,线性探测策略是顺序(每次探测间隔为1)的。 开放寻址法(Open Add...

Golang defer、panic和recover

defer defer是 Go语言中的关键字,也是Go语言的重要特性之一。defer 的语法形式为 defer Expression,其后必须紧跟一个函数调用或者方法调用。在很多时候,defer后的函数以匿名函数或闭包的形式呈现,例如: 1 2 3 defer func(...){ //实际处理 }() defer将其后的函数推迟到了其所在函数返回之前执行。例如在运行如下代码后,将首先打印...

Golang通道

基本使用方式 通道是Go语言中的一等公民,将箭头(←)作为操作符进行通道的读取和写入。 1 2 c <- number <- c 通道声明与初始化 chan作为Go语言中的类型,其最基本的声明方式如下: 1 var name chan T name代表chan的名字,为用户自定义的; chan T代表通道的类型,T代表通道中的元素类型。在声明时,channel必须与...

Golang数组与切片

数组 数组是内存中一片连续的区域,需要在初始化时被指定长度,数组的大小取决于数组中存放的元素大小。 1 2 3 4 // 数组声明的三种方式 var arr [3]int var arr2 = [4]int{1, 2, 3, 4} arr3 := [...]int{2, 3, 4} 对于数组还有一种语法糖,可以不用指定类型,如arr3 := […]int{2,3,4},这种声明方式在编译时...

Golang协程

进程、线程和协程 进程就是应用程序的启动实例,拥有代码和打开的文件资源、数据资源、独立的内存空间。 线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程,并拥有自己的栈空间。 对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。 协程Goroutine是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以...

Golang函数

使用方式 函数是一等公民(first-class) ,可将它看作变量,并且可作为参数传递、返回及赋值。 1 2 3 4 5 6 7 8 9 10 11 12 13 //函数作为返回值 func makeGreeter() func() string { return func() string { return "hello jonson" } } //函数作为参数...

Golang字符串本质与实现

字符串本质 在Go语言中,字符串不能被修改,只能被访问,不能采取如下方式对字符串进行修改。 1 2 var b = "hello world" b[1] = '0' Go语言运行时字符串string的表示结构如下。 1 2 3 4 type StringHeader struct { Data uintptr Len int } 其中,Data指向底层的字符数组,Len 代表字符串...