
go语言核心36讲
ashane1314
不忘初心
展开
-
golang MPG模型
线程与协程区别线程:是系统级线程,由系统自动创建,和销毁。 协程:架设在系统级线程之上的,由用户级线程,由用户(或者程序)完全控制的代码执行流程。用户级线程的创建销毁调度状态变更以及其中的代码和数据完全需要我们的程序自己去实现和处理。协程优势协程创建和销毁并不用通过操作系统去做,所以速度会很快。 不用操作系统调度运行,所以往往很容易控制,所以很灵活。协程劣势最明显也最重要的一个劣势就是复杂。线程一切操作系统代劳,而协程必须自己实现操作。GMP模型Mmachine:系统级线程原创 2020-06-27 00:43:49 · 677 阅读 · 1 评论 -
Golang三色标记、混合写屏障GC模式图文全分析
垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行。 Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可并发运行,但需要一定时间的STW(stop the world),STW的过程中,CPU不执行用户代码,全部用于垃圾回收,这个过程的影响很大,Golang进行了多次的迭代优化来解决这个问题。〇、内容提纲本文将系统的详细介绍Golang中GC的全分析过程,包括垃转载 2020-06-19 20:03:39 · 1327 阅读 · 0 评论 -
sync.Map
综述并发安全字典内部“通过大量的原子操作来尽量避免时使用锁”来保证并发安全的同时且性能更加。结构内部存储两个原生mapread只读字典:只读仅针对其key而言,key不允许增减,却允许改变所对应的值。而且对其值的操作是个原子操作的封装,无需加锁,尽量避免了使用锁。只读字典的操作都不需要加锁。dirty脏字典:脏字典和只读字典如果存在同一个键值对,那这两个key指向同一个值的指针。脏字典的操作都才需要加锁。misses 当穿透只读字典从脏字典中读取值的次数达到水位线时候,脏字典提升为只原创 2020-06-19 11:40:41 · 255 阅读 · 0 评论 -
go 协程切换时机
go异步并发模型MPG 模型阻塞 I/Oselect操作阻塞在channel等待锁主动调用 runtime.Gosched()原创 2020-05-28 20:47:38 · 1089 阅读 · 0 评论 -
条件变量
用途条件变量是基于互斥锁的一种同步工具,它必须有互斥锁(sync.Mutex/sync.RWMutex)的支撑才能发挥作用。 条件变量可以协调那些想要访问共享资源的线程。当共享资源的状态发生变化时,它可以被用来通知被互斥锁阻塞的线程实例package mainimport ( "fmt" "sync" "time")func main() { // 邮箱 var ...原创 2020-02-09 18:47:59 · 179 阅读 · 0 评论 -
sync.Mutex与sync.RWMutex
竞态条件数据被多个线程共享,那么很可能就产生争用或者冲突,这种场景叫静态条件,这往往会破坏共享数据的一致性。同步方式避免多个线程在同一时刻操作同一个数据块。 协调多个线程,以避免它们在同一时刻执行同一个代码块。由于这样的数据块和代码块的背后都隐含着一种或多种资源(比如存储资源、计算资源、I/O 资源、网络资源等等),所以我们可以把它们看做是共享资源,或者说共享资源的代表。我们所说的...原创 2020-02-09 18:41:40 · 244 阅读 · 0 评论 -
错误处理
panic,recover,deferpackage mainimport "fmt"func div(i, j int) int { defer func() { if rc := recover(); rc != nil { fmt.Println("this is recover :", rc) } }() return i/j}func mai...原创 2020-01-30 19:47:58 · 178 阅读 · 0 评论 -
go语句及执行规则
协程概念MPG模型todo疑问package mainimport ( "fmt" "runtime" "time")func main() { fmt.Println("cup ",runtime.NumCPU()) for i := 0; i < 10; i++ { go func() { fmt.Println(i, &i) }...原创 2020-01-30 10:03:40 · 296 阅读 · 0 评论 -
函数式编程
函数是一等的公民函数可以定义为值类型高阶函数函数作为参数传递给另一个函数 函数作为另一个函数的返回值闭包函数高阶函数和闭包函数的好处与优势:TODO...原创 2019-12-24 11:00:01 · 86 阅读 · 0 评论 -
通道
用途不要通过共享内存来通信,要通过通信来共享内存。后通道就是后半句的完美实现。特点go自带的唯一一个支持并发安全的数据类型。一个通道相当于一个先进先出(FIFO)的队列。也就是说,通道中的各个元素值都是严格地按照发送的顺序排列的,先被发送通道的元素值一定会先被接收。类型缓冲通道非缓冲通道todo:底层实现?通道的发送和接收特点对于同一个通道,发送操作之间是互...原创 2019-12-23 10:04:56 · 404 阅读 · 0 评论 -
容器container
container/list链表定义element 链表中的元素实体 list 链表实体常用方法延迟初始化优点在于“延迟”,它可以分散初始化操作带来的计算量和存储空间消耗。缺点在于“延迟”,如果我在调用链表的每个方法的时候,它们都需要先去判断链表是否已经被初始化,那这也会是一个计算量上的浪费。在这些方法被非常频繁地调用的情况下,这种浪费的影响就开始显现了,程...原创 2019-12-17 22:06:53 · 651 阅读 · 0 评论 -
程序实体
类型断言判断一个变量类型package mainimport "fmt"var block = "package"func main() { var block = 111 { var block = bool(true) v, ok := interface{}(block).(bool) //类型断言:block若是bool类型,ok为true,block自...原创 2019-12-16 21:14:22 · 619 阅读 · 0 评论 -
命令源码文件
源码文件参数接收与解析flag包flag.StringVar flag.String flag.Parse支持参数类型int(int|int64|uint|uint64),float(float|float64)string,bool,duration(时间),var(自定义)gin路...原创 2019-12-16 16:59:37 · 154 阅读 · 0 评论 -
工作区和GOPATH
关键路径gorootgopath bin pkg src 关键命令go buildgo installgo get参考文档原创 2019-12-16 16:19:12 · 143 阅读 · 0 评论 -
go的编程哲学和设计理念
go语言是互联网时代的语言,融合了众多互联网时代程序设计的特征。并行与分布式支持。多核化和集群化是互联网时代的典型特征。并发执行的“执行体”执行体是个抽象的概念,在操作系统层面有多个概念与之对应,如操作系统自己掌管的进程(process)、进程内的线程(thread)以及进程内的协程 (coroutine,也叫轻量级线程)。多数语言在语法层面并不直接支持协程,而通过库的方式支持的协程的...原创 2019-12-12 21:36:06 · 1052 阅读 · 0 评论