go语言
文章平均质量分 84
suxuefeng123
golang,docker,k8s,微服务,后端
展开
-
golang的GC及GC调优
v1.5之后使用了三色标记清除1.程序启初创建,全部标记为白色,将所有对象放入白色集合中2.遍历root set(非递归形式,只遍历一次),得到灰色节点,将灰色节点放入灰色集合中。3.遍历灰色的标记表,将可达到的对象从白色标记为灰色,其本身从灰色变成黑色。重复此步骤,直到灰色标记表中无任何对象4.删除所有的白色对象2.为什么GC过程中需要STW?如果没有STW,发生上面的情况,会把引用的对象删除,造成数据混乱。............原创 2022-05-18 10:21:00 · 4248 阅读 · 0 评论 -
go语言的局部变量是在栈中还是堆中?
先看这两个代码:这两段代码只是调用的打印函数不一样,但是局部变量一个放在堆中,一个是放在栈中的。直接说原因:go语言编译器会做逃逸分析,分析局部变量的作用域是否逃出了函数的作用域,要是没有就放到栈上,要是超出了函数的作用域就自动放到堆上。fmt.println函数使局部变量的作用域超出了函数的作用域,所以局部变量是在堆上。而println是内联函数,并没有使局部变量的作用域逃出函数的作用域,所以是在栈上。...原创 2020-08-27 10:25:57 · 1174 阅读 · 0 评论 -
判断channel是否有数据
使用close函数关闭通道 数据不发送完,不应该关闭通道 已经关闭的channel,不能再向其写数据。如果向已经关闭的通道写数据,会报错。panic:send on closed channel 已经关闭的channel,可以从中读到数据0。读到0就说明:写端已经关闭了。package mainimport "fmt"func main() { ch := make(...原创 2019-05-21 12:14:36 · 6952 阅读 · 1 评论 -
select与斐波那契数列
select: 作用:用来监听channel上的数据流动方向。读和写 用法:参考switch case语句。但是case后面必须是IO操作,不能任意写判别表达式。 注意事项: 1.监听的case中,没有满足监听条件,阻塞。 2.监...原创 2019-05-21 14:35:17 · 172 阅读 · 0 评论 -
互斥锁,读写锁,条件变量
go语言中解决协程同步的问题,可以使用channel,但go也提供了传统的同步工具。他们都在go的标准库代码包sync和sync/atomic中。go语言中尽量不要将互斥锁,读写锁和channel一起使用,会造成--隐性死锁。ps:如果非要一起使用,使用条件变量sync.cond 什么是锁? 就是某个协程(线程)在访问某个资源时先锁住,防止其他协程的访问,等访问完毕...原创 2019-05-21 21:58:01 · 460 阅读 · 0 评论 -
同步等待组WaitGroup
WaitGroup:同步等待组。ps:值类型,传递时需要指针 内置的计数器:要执行的goroutine的数量 Add(3):设置3个要执行的goroutine Done():将内置的计数器数量减一。等同于Add(-1) Wait():等待。导致执行wait...原创 2019-05-22 12:26:08 · 521 阅读 · 0 评论 -
go语言的接口
1.接口断言因为空接口interface{}没有定义任何函数,因此Go中所有类型都实现了空接口。当一个函数的形参是interface{},那么在函数中,需要对形参进行断言,从而得到他的真实类型。package mainimport ( "fmt" "math")/*接口断言方法1:instance, ok := 接口对象.(实际类型) //安全方法2:switc...原创 2019-08-23 19:29:14 · 187 阅读 · 0 评论 -
go语言实现一个无限buffer的channel
我们知道go语言内置的channel缓冲大小是有上限的,那么我们自己如何实现一个无限缓冲的通道呢?代码如下:package mainimport ( "container/list" "fmt" "sync")func UnlimitedChannel() (chan <...原创 2019-09-21 20:38:30 · 1000 阅读 · 0 评论