贾永琪的技术博客

Go-知识逃逸分析

栈上分配内存比在堆中分配内存有更高的效率。栈上分配的内存不需要GC处理。对上分配的内存使用完毕会交给GC处理。逃逸分析的目的是决定分配地址是栈还是堆。逃逸分析在编译阶段完成。在编程的时候,应该尽可能避免产生内存逃逸。传递指针可以减少底层值的赋值,可以提高效率,但是如果赋值的数据量小,由于指针传递会产生逃逸,则可能会使用堆,也可能增加GC的负担,所以指针传递不一定是高效的。

Go-知识sync map

sync map 将互斥锁内置实现并发读写,将互斥锁的范围仅仅限定在dirty表,减少锁等待和锁调用,提升性能。因为dirty表和read表总是在争取保持一致,所以大部分读场景下,read表就能查询到数据,适合读多写少。sync map 中read表和dirty表都会持有key,所以内存占用上会比较大,而且在写多读少的场景下,因为既要遍历read表,又要遍历dirty表,性能上会比较慢。_go sync.map

Go-知识string

在Go语言的设计中, string 通常指的是字符串的字面量,而且字符串一般情况下存储的位置也是只读,而不是堆或者栈(这里可能一定程度上借鉴了汇编之类的语言)。所以设计为string不可修改。当string不可修改后,带来的好处是string变得非常轻量,而且可以放心的在go-routine中进行传递,不用考虑并发冲突和内存拷贝。_go string 双引号转单引号

Go-知识struct

Go 语言的struct与Java中的class类似,可以定义字段和方法,但是不能继承。a int需要注意的是,在Go里面,访问权限是通过name的大小写指定的,小写表示包内可见,如果是大写则表示包外可见。同样的,如果创建的struct想让包外可见,那么必须是大写开头。id int在Go里面一般不会区分函数和方法,或者更好理解的话,可以认为方法是受限的函数,限制了函数调用者,那么就是方法。同样的,上述方法包内可见。上述方法虽然包外可见,但是没有意义,因为tes。_go struct