全部文章
Go 系统监控
很多系统中都有守护进程,它们能够在后台监控系统的运行状态,在出现意外情况时及时响应。系统监控是 Go 语言运行时的重要组成部分,它会每隔一段时间检查 Go 语言运行时,确保程序没有进入异常状态。
Go 网络轮询器
网络轮询器并不是由运行时中的某一个线程独立运行的,运行时的调度器和系统调用都会通过 runtime.netpoll 与网络轮询器交换消息,获取待执行的 Goroutine 列表,并将待执行的 Goroutine 加入运行队列等待处理。所有的文件 I/O、网络 I/O 和计时器都是由网络轮询器管理的,它是 Go 语言运行时重要的组成部分。
Go 定时器
准确的时间对于任何一个正在运行的应用非常重要,但是在分布式系统中我们很难保证各个节点的绝对时间一致,哪怕通过 NTP 这种标准的对时协议也只能把各个节点上时间的误差控制在毫秒级,所以准确的相对时间在分布式系统中显得更为重要。
Go 同步原语与锁
Go 语言作为一个原生支持用户态进程(Goroutine)的语言,当提到并发编程、多线程编程时,往往都离不开锁这一概念。锁是一种并发编程中的同步原语(Synchronization Primitives),它能保证多个 Goroutine 在访问同一片内存时不会出现竞争条件(Race condition)等问题。
Go 上下文 Context
上下文 context.Context 它是 Go 语言中用来设置截止日期、同步信号、传递请求相关值得结构体。它一个在 Go1.17 版本中引入标准库得接口
Go 调度器
Go 的并发编程之所以能力强大,离不开语言层面对并发编程的支持。并发离不开操作系统、进程与线程这些概念,线程 是操作系统调度时的最基本单元,Linux 调度器并不区分进程和线程的调度,不同的操作系统上也有不同的实现,而大多数的实现中都是线程属于进程:
Go 语言 Channel
Channel 是 Go 核心的数据结构和 Goroutine 之间的通信方式,是支撑 Go 语言高性能并发编程模型的重要结构。Go 语言提倡通过通信的方式共享内存,而不是通过通信的方式共享内存。
Go 语言 make 和 new
make 的作用是初始化内置数据结构的,例如切片、哈希表和 Channel。new 的作用是根据传入的类型分配一片内存空间,并返回指向该内存空间的指针。
Go defer
Go 语言中 defer 会在当前函数返回前执行传入的函数,经常用于关闭文件描述符、关闭数据库连接以及解锁资源。
Go 语言中的 select
select 是操作系统中的系统调用,经常使用 select、poll、epoll 等函数构建 I/O 多路复用模型提升程序的性能。Go 语言中的 select 与操作系统中的 select 比较类似,select 能够让 Goroutine 阻塞的等待多个 Channel 可读可写。
Go 反射 reflect
relect 包实现了运行时的反射能力,程序可以操作不同的对象,其中最重要的两个函数:reflect.TypeOf 和 reflect.ValueOf,两个类型是 reflect.Type 和 reflect.Value,它们与函数是一一对应的关系
Go 接口 interface
Go 语言中的接口是一组方法的签名,它是 Go 语言的重要组成部分。接口的本质是引入一个新的中间层,调用方可以通过接口与具体实现分离,解除上下游的耦合,上层的模块不再需要依赖下层的具体模块,只需要依赖一个约定好的接口。
即我们只需要关注怎么使用,而不需要关注具体实现。
计算机科学中的接口是
Go 函数调用
函数参数传递分为值传递和引用传递,下面是两者的区别:传值:函数调用时会多参数进行拷贝,调用方和被调用方持有不相关的两份数据。引用传递:函数调用时会传递参数的指针,被调用方和调用方两者持有相同的数据,任意一方做出的修改都会影响另一方。
Go 基本数据结构学习笔记总结
数组、切片、哈希表、字符串是Go中常用的数据
Go 语言中的正常模式和饥饿模式
在正常模式下,锁的等待会按照先进先出的顺序获的,但是刚刚被唤起的 Goroutine 会与新创建的 Goroutine 竞争,此时大概率会获取不到锁,为了减少这种情况的出现,一旦 Goroutine 超过 1ms 没有获取到锁,此时就会切换到饥饿模式。