Go设计模式 - 概述1. Go设计模式概述如果把修习软件开发当做武功修炼的话,那么可以分为招式和内功。 招式: ●Java、C#、C++、Golang、Rust等编程语言; ● Eclipse、Visual Studio、Goland、Vim等开发工具; ● Struts、Hibernate、JBPM、Gin、Istio、gRPC等框架技术; 内功: ●数据结构 ●算法 ●设计模式 ●架构设计 ●软 2022-05-01 Go设计模式 #Go设计模式
常见坑1~101.常见坑1~1001.nil slice & empty slice1.1 nil切片与空切片底层 nil切片:var nilSlice []string nil slice 的长度len和容量cap都是0 nil slice == nil nil slice的pointer 是nil, 空切片:emptySlice0 := make([]int, 0) empty slice的长度 2022-04-21 Go进阶 #Go进阶
Golang常犯错误1.Golang常犯错误01.01~1001.nil的slice和map 允许对值为 nil 的 slice 添加元素,但对值为 nil 的 map 添加元素,则会造成运行时 panic。 // map 错误示例 func main() { var m map[string]int m["one"] = 1 // error: panic: assignment to 2022-04-20 Go进阶 #Go进阶
mutex锁原理1.mutex锁原理01.Mutex1.1 mutex结构体 源码包src/sync/mutex.go:Mutex定义了互斥锁的数据结构 type Mutex struct { state int32 // 表示互斥锁的状态,比如是否被锁定等 sema uint32 // 表示信号量,协程阻塞等待该信号量,解锁的协程释放信号量从而唤醒等待信号量的协 2021-02-23 Go进阶 #Go进阶
sync.Map1.sync.map01.sync.Map介绍1.1 sync.Map介绍 简单说:空间换时间+读写分离+原子操作(快路径) sync.Map 的主要思想就是读写分离,空间换时间 。 sync.Map底层使用了两个原生map,一个叫read,仅用于读; 一个叫dirty,用于在特定情况下存储最新写入的key-value数据 1.2 sync.Map特点 1、空间换时间:通过冗余的两个Ma 2021-02-22 Go进阶 #Go进阶
sync.Pool1.sync.Pool01.sync.Pool介绍1.1 是什么 sync.Pool 是 sync 包下的一个组件,可以作为保存临时取还对象的一个“池子”。 个人觉得它的名字有一定的误导性,因为 Pool 里装的对象可以被无通知地被回收,可能 sync.Cache 是一个更合适的名字。 Pool 结构体的定义为: Pool 中有两个定义的公共方法,分别是 Put - 向池中添加元素; Get 从池 2021-02-21 Go进阶 #Go进阶
协程调度GMP模型1.协程调度GMP模型01.线程调度1.1 早期单线程操作系统 一切的软件都是跑在操作系统上,真正用来干活(计算)的是CPU。 早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是“单进程时代” 一切的程序只能串行发生。 1.2 多进程/线程时代 在多进程/多线程的操作系统中,就解决了阻塞的问题,因为一个进程阻塞cpu可以立刻切换到其他进程中去执 2021-02-20 Go进阶 #Go进阶
chan读写问题1.chan读写问题01.对关闭chan读写 golang面试题:对已经关闭的的chan进行读写,会怎么样?为什么? 读已经关闭的 chan 能一直读到东西,但是读到的内容根据通道内关闭前是否有元素而不同。 1)读取有元素,且关闭的chan 会正确读到 chan 内的值,且返回的第二个 bool 值(是否读成功)为 true。 2)读取无元素,且关闭的chan chan 内无值,接下来所有接收 2021-02-15 Go进阶 #Go进阶
深浅拷贝1.深浅拷贝01.深浅拷贝1.1 深浅拷贝定义 浅拷贝就是只拷贝指针的值,指针指向的内容只有一份。 而深拷贝是把指针指向的值拷贝一份。 golang里面也有浅拷贝和深拷贝。 slice的浅拷贝就是指slice变量的赋值操作。 slice的深拷贝就是指使用内置的copy函数来拷贝两个slice。 1.2 深浅拷贝代码举例package main import "fmt" func main() 2021-02-12 Go进阶 #Go进阶
垃圾回收1.垃圾回收01.三种常见垃圾回收机制1.0 垃圾回收是什么 传统的系统级编程语言(主要指C/C++)中,程序员必须对内存小心的进行管理操作,控制内存的申请及释放。 稍有不慎,就可能产生内存泄露问题,这种问题不易发现并且难以定位 后来开发出来的几乎所有新语言(java,python,php等等)都引入了语言层面的自动内存管理 也就是语言的使用者只用关注内存的申请而不必关心内存的释放 内存 2021-02-11 Go进阶 #Go进阶