摘要:
概述 go 的 select 语句是专门为了 channel 发送和接收消息而诞生的专用语句(不要和 switch 搞混了), 在语句的运行期间, 该 goroutine 是阻塞的. select 在 golang 的语言层提供了I/O 多路复用, 可以同时检测多个 channel I/O 多路复用 阅读全文
摘要:
概述 linux 最开始使用的线程是linuxThreads, 但是linuxThreads不符合POSIX标准, 后来出现了NGPT, 性能更高, 之后又出现了NPTL, 比NGPT更快, 随着时间推移, 就只剩下NPTL了 NPTL>NGPT>linuxThreads 线程的模型分为三种: 多对 阅读全文
摘要:
一般的内存分配 一般而言, 内存都会被程序分为以下几个逻辑块 全局区: 存放全局变量 栈区: 存放函数中的基础类类型变量 堆区: 动态分配的内存, 比如 go 的切片 常量区: 存放常量数据 程序代码区: 存放程序本身的代码 go 内存分配思想 go 内置了运行时的编程语言(runtime), 所谓 阅读全文
摘要:
前言 sync的常用包好像都快讲完了, 最近几天进度很快啊, 希望能多多保持. sync.WaitGroup是为了解决任务编排而出现的, 主要就是解决并发-等待问题, 因此在真正编写过程中也很常用, 本篇大致讲解其内部实现的方式 Demo 简单介绍一下用法 func main() { wg := s 阅读全文
摘要:
前言 起因是在编写某个模块时, 考虑到slice良好的伸缩性, 便使用slice来存储大量的数据, 业务是slice的数据会慢慢的弹出减少, 理想状态下内存占用会越来越少, 结果发现, 占用的内存并不会返还, 于是查了一下, 好家伙 😵💫, 坑还不少, 索性这里记录一下坑吧 slice sli 阅读全文
摘要:
前言 最近真高产啊, 果然有压力就有动力了, 不知道能保持多久, 真是痛并快乐着 什么是 Channel channel常用来作为多个协程直接通信, 在真正编写代码中使用频率非常高, 他就是一个管道, 先进先出, 那么, 作为程序员, 有必要了解channel的实现原理 数据结构 那么, 和往常一样 阅读全文
摘要:
普通的 map 普通的map并不是并发安全的, 但是在 go 的1.6之前不会报错, 但是会出现问题, 1.6之后会直接报错.例如以下代码: package main import ( "fmt" "time" ) func main() { m := map[string]int{"age": 1 阅读全文
摘要:
前言 go 语言的锁, 一说大家都知道, 一个是互斥锁Mutex, 一个是读写互斥锁RWMutex, 用起来很简单, 但是要想在技术上更进一步, 还是需要了解其原理 基础知识 进程同步 既然是锁, 就意味着在加锁之后, 其他goroutine获取锁, 就需要等待, 这里就需要了解操作系统的进程同步机 阅读全文
摘要:
前言 本文介绍 golang 中 map 的实现方式, 希望对读者和我有所帮助 结构 map是 go 语言中的基础的数据结构, 在寻找指定key时, 复杂度是O(1), 在某些场景能发挥很大的作用 golang 的 map 是 hashmap, 实现方式是数组+链表, 并且使用拉链法来取消 hash 阅读全文
摘要:
前言 稍微记录一下问题点吧, 文章会不断的优化更新 有些比较大的知识点, 比如锁原理啥的, 会单独拎出来写一篇, 这里只是大概 Go 语言的基础数据类型占用大小 | 类型 | 大小(字节) | | | | | Int8 | 1 | | Int16 | 2 | | Int32 | 4 | | Int6 阅读全文