介绍
接触golang也有一年多了,写博客主要是记录一下日常所学和遇到的坑。
1.go特色
1.开放源代码,go本是就是用go语言编写的。
2.静态类型和编译型。
3.跨平台。
4.自动垃圾回收。
5.原生并发编程。
6.完善的构建工具。
7.多编程范式。
8.代码风格强制统一。
2.go中的引用传递和值传递
Golang 中函数之间传递变量时总是以值的方式传递的,无论是 int,string,bool,array 这样的内置类型(或者说原始的类型),还是 slice,channel,map 这样的引用类型,在函数间传递变量时,都是以值的方式传递,也就是说传递的都是值的副本。
Go 语言里的引用类型有如下几个:切片、映射、通道、接口和函数类型。当声明上述类型的变量时,创建的变量被称作标头(header)值。从技术细节上说,字符串也是一种引用类型。每个引用类型创建的标头值是包含一个指向底层数据结构的指针。因为标头值是为复制而设计的,所以永远不需要共享一个引用类型的值。标头值里包含一个指针,因此通过复制来传递一个引用类型的值的副本,本质上就是在共享底层数据结构。
所以,引用类型在函数传递的时候,是值传递,只不过这里的“值”指的是标头值。
3.new和make,二者有明显区别
适用范围:make 只能创建内建类型(slice map channel), new 则是可以对所有类型进行内存分配
返回值: new 返回指针, make 返回引用
填充值: new 填充零值, make 填充非零值
4.golang中的map
1.打印是随机的
2.不是线程安全的
5.对象池
在高并发或者大量的数据请求的场景中,我们会遇到很多问题,垃圾回收就是其中之一,为了减少优化GC,我们一般想到的方法就是能够让对象得以重用。这就需要一个对象池来存储待回收对象,等待下次重用,从而减少对象产生数量。我们可以把sync.Pool类型值看作是存放可被重复使用的值的容器。此类容器是自动伸缩的、高效的,同时也是并发安全的。
6.接口的实现
只要一个数据类型的方法集合中包含某个接口声明的所有方法,那么它一定就是这个接口的实现类型(刚接触时一直不明白接口与方法之间怎么关联上的)
7.垃圾回收
常用的垃圾回收主要有引用计数,标记-清除,分代收集,三色标记
go用的是三色标记。
首先创建三个集合:白、灰、黑。
将所有对象放入白色集合中。
然后从根节点开始遍历所有对象(注意这里并不递归遍历),把遍历到的对象从白色集合放入灰色集合。
之后遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合
重复 4 直到灰色中无任何对象
重复以上操作
收集所有白色对象(垃圾)
8.切片
切片自己不拥有任何数据。它只是底层数组的一种表示。对切片所做的任何修改都会反映在底层数组中。
9.defer
多个defer出现的时候,多个defer之间按照LIFO(后进先出)的顺序执行
10.for range
用for range来遍历数组或者map的时候,被遍历的指针是不变的。
11.make(chan int)
make(chan int) 和 make(chan int, 1)是不一样的,make(chan int)一旦被写入数据后,当前goruntine就会被阻塞,直到有人接收才可以。make(chan int, 1)是直到写入第二个数据才会阻塞。
12.channel
1.channel如果close了以后,写或者再次close会panic,可以正常读。
2.如果go出去一个线程,报了panic,主线程也会中断,并且主线程recover无法接到子线程的panic。