随笔分类 -  Golang

摘要:Golang 面试题 (4) N个协程交替打印1-100 启动N个协程,共用一个外部变量计数器,计数器范围是1到100 开启N个有缓冲chan,chans[i]塞入数据代表协程i可以进行打印了,打印的数字就是计数器的数 协程i一直阻塞,直到chan[i]通道有数据可以拉,才打印 func main( 阅读全文
posted @ 2022-04-13 20:40 西*风 阅读(772) 评论(0) 推荐(0) 编辑
摘要:Golang面试编程题3 实现两个协程轮流输出A 1 B 2 C 3 .... Z 26 方案1:有缓冲的chan func ChannelFunc() { // 思想:两个g,一个输出数字,一个输出字母,重点是如何控制两个g的打印顺序,让其可以轮流打印 // 分别使用两个缓存为1的chan,来控制 阅读全文
posted @ 2022-04-13 20:12 西*风 阅读(879) 评论(0) 推荐(0) 编辑
摘要:Golang面试编程题2 实现一个函数可以根据指定的size切割切片为多个小切片 func main() { lenth := 11 size := 5 list := make([]int, 0, lenth) for i := 0; i < lenth; i++ { list = append( 阅读全文
posted @ 2022-04-13 18:37 西*风 阅读(277) 评论(0) 推荐(0) 编辑
摘要:Golang 面试题 (1) 用协程交替打印奇偶数 两个G,分别打印奇数和偶数 无缓冲channel通知这两个G,控制打印顺序 var flagChan=make(chan int) func wokr1(){ for i:=1;i<=10;i++{ flagChan <- 1 //塞入 if i% 阅读全文
posted @ 2022-04-08 16:04 西*风 阅读(396) 评论(0) 推荐(0) 编辑
摘要:Golang - 分段锁实现并发安全Map 一.引言 我们一般有两种方式来降低锁的竞争: 第一种:减少锁的持有时间,sync.Map即是采用这种策略,通过冗余的数据结构,使得需要持有锁的时间,大大减少。 第二种:降低锁的请求频率,锁分解和锁分段技术即是这种思想的体现。 锁分段技术又可称为分段锁机制 阅读全文
posted @ 2022-02-12 10:39 西*风 阅读(1194) 评论(0) 推荐(0) 编辑
摘要:Golang - sync.map 设计思想和底层源码分析 一.引言 在Go v1.6之前,内置map是部分goroutine安全的,并发读没有问题,并发写可能有问题 在Go v1.6之后,并发读写内置map会报错,在一些知名的开源库都有这个问题,所以在Go v1.9之前,解决方案是加一个额外的大锁 阅读全文
posted @ 2022-01-24 13:00 西*风 阅读(1543) 评论(2) 推荐(2) 编辑
摘要:Golang - Map 内部实现原理解析 一.前言 Golang中Map存储的是kv键值对,采用哈希表作为底层实现,用拉链法解决hash冲突 本文Go版本:gov1.14.4,源码位于src/runtime/map.go 二.Map的内存模型 在源码中,表示map的结构体是hmap,是hashma 阅读全文
posted @ 2022-01-18 18:41 西*风 阅读(1752) 评论(0) 推荐(0) 编辑
摘要:Golang - slice 内部实现原理解析 一.Go中的数组和slice的关系 1.数组 在几乎所有的计算机语言中,数组的实现都是一段连续的内存空间,Go语言数组的实现也是如此,但是Go语言中的数组和C语言中数组还是有所不同的 C语言数组变量是指向数组第一个元素的指针 Go语言的数组是一个值,一 阅读全文
posted @ 2022-01-14 17:31 西*风 阅读(356) 评论(0) 推荐(0) 编辑
摘要:#Golang-Context扫盲与原理解析 一.什么是Context? context是一个包,是Go1.7引入的标注库,中文译做上下文,准确的说是goroutine的上下文,包含goroutine的运行状态,环境,现场等信息。 context主要用于在goroutine之间传递上下文信息,比如取 阅读全文
posted @ 2022-01-14 10:59 西*风 阅读(681) 评论(0) 推荐(0) 编辑
摘要:无限缓存channel的设计与实现 一.引言 Go语言的Channel有两种类型,一种是无缓存的channle,一个种是有缓存的channel,但是对于有缓存的channle来说,其缓存长度在创建时就已经固定了,中间也不能扩缩容,这导致对某些特定的业务场景来说不太方便 业务场景如下 : 爬虫场景,想 阅读全文
posted @ 2022-01-10 15:38 西*风 阅读(861) 评论(0) 推荐(0) 编辑
摘要:如何优雅的关闭channel? channel关闭原则 "如何优雅的关闭channel?",这种问题经常在面试题中出现,究其原因,是因为channel创建容易,但是关闭"不易",原因有以下三点: 关闭时机未知,在不改变channel自身状态的条件下,无法知道他是否已经关闭 不能无脑关闭,如果一个ch 阅读全文
posted @ 2022-01-06 11:19 西*风 阅读(710) 评论(0) 推荐(0) 编辑
摘要:Golang-channel底层实现精要 一.channel 背景知识 channel是Go语言内置的核心类型,可以将其看做一个管道,channel和goroutine一起为go并发编程提供了最优雅和便利的方案 在Go中有一句经典名言,永远不要通过共享内存来通信,而是要通过通信来共享内存,chann 阅读全文
posted @ 2022-01-05 16:05 西*风 阅读(944) 评论(0) 推荐(0) 编辑
摘要:Golang调度器原理解析 本文主要介绍调度器的由来以及golang调度器为何要如此设计,以及GPM模型解析 一.调度器的由来 1.单进程时代 单进程时代不需要调度器,一切程序都是串行,所以单进程的操作系统会面临这样一个问题: 程序只能串行执行,一个进程阻塞了,其他进程啥事也做不了,只能等待,会造成 阅读全文
posted @ 2021-12-31 11:42 西*风 阅读(434) 评论(0) 推荐(0) 编辑
摘要:go并发编程 一.背景知识介绍 1.进程和线程 进程是程序在操作系统中一次执行的过程,系统进行资源分配和调度的基本单位 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位 一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行 2.并发和并行 阅读全文
posted @ 2021-12-31 11:41 西*风 阅读(372) 评论(0) 推荐(0) 编辑
摘要:go 垃圾回收 本文基于整个go的gc发展,来研究其gc的演变过程,不单针对某个版本的gc,因为go的gc一直在演变 一.GO GC的发展历史 go v1.1 : 标记清除法,整个过程都需要STW go v1.3 : 标记清除法,标记过程仍然需要STW,但是清除过程并行化,gc pause约为几百m 阅读全文
posted @ 2021-12-28 10:38 西*风 阅读(1950) 评论(0) 推荐(0) 编辑
摘要:Go内存分配-原理解析 一. 背景介绍 先了解一下Linux系统内存相关的背景知识,有助于我们了解Go的内存分配 1.覆盖技术 在上古时代的内存管理中,如果程序太大,超过了空闲内存容量,就无法把全部程序装入内存中,这个时候诞生出了一种解决方案,即覆盖技术, 简而言之,就是把程序分为若干个块,只把哪些 阅读全文
posted @ 2021-12-22 22:52 西*风 阅读(704) 评论(0) 推荐(0) 编辑
摘要:fetch.go// fetch 输出从url获取的内容package mainimport ( "fmt" "io/ioutil" "net/http" "os")func main() { // 获取屏幕输入的URL for _, url := range os.Args[1:] { resp, err := http.Get(url)// 请求url,获得响应 if (err != ni... 阅读全文
posted @ 2020-03-26 16:52 西*风 阅读(416) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示