摘要:
golang程序变量会携带有一组校验数据,用来证明它的整个生命周期是否在运行时完全 可知。如果变量通过了这些校验,它就可以在栈上分配。否则就说它 逃逸 了,必须在 堆上分配。 能引起变量逃逸到堆上的典型情况: 在方法内把局部变量指针返回 局部变量原本应该在栈中分配,在栈中回收。但是由 于返回时被 阅读全文
摘要:
package main import "fmt" const ( a = iota b = iota ) const ( name = "menglu" c = iota d = iota ) func main() { fmt.Println(a) fmt.Println(b) fmt.Prin 阅读全文
摘要:
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup out := make(chan int) wg.Add(2) go func() { defer wg.Done() for i := 1; i <= 阅读全文
摘要:
你好,我是鸟窝。 在前面的四节课中,我们学习了第一个同步原语,即Mutex,我们使用它来保证读写共享资源的安全性。不管是读还是写,我们都通过Mutex来保证只有一个goroutine访问共享资源,这在某些情况下有点“浪费”。比如说,在写少读多的情况下,即使一段时间内没有写操作,大量并发的读访问也不得 阅读全文
摘要:
package main import ( "fmt" ) type People struct{} func (p *People) ShowA() { fmt.Println("showA") p.ShowB() } func (p *People) ShowB() { fmt.Println( 阅读全文
摘要:
那么go语言的局部变量到底是在栈上还是堆上呢?go语言编译器会做逃逸分析(escape analysis),分析局部变量的作用域是否逃出函数的作用域,要是没有,那么就放在栈上;要是变量的作用域超出了函数的作用域,那么就自动放在堆上。所以不用担心会不会memory leak,因为go语言有强大的垃圾回 阅读全文
摘要:
前面我们在学习Mutex、RWMutex等并发原语的实现时,你可以看到,最底层是通过atomic包中的一些原子操作来实现的。当时,为了让你的注意力集中在这些原语的功能实现上,我并没有展开介绍这些原子操作是干什么用的。 你可能会说,这些并发原语已经可以应对大多数的并发场景了,为啥还要学习原子操作呢?其 阅读全文
摘要:
在这节课正式开始之前,我想先带你看一个工作中的场景。 假设有一天你进入办公室,突然同事们都围住你,然后大喊“小王小王你最帅”,此时你可能一头雾水,只能尴尬地笑笑。为啥呢?因为你缺少上下文的信息,不知道之前发生了什么。 但是,如果同事告诉你,由于你业绩突出,一天之内就把云服务化的主要架构写好了,因此被 阅读全文