一.自动回收算法又称gc
以C++为例子
C++不支持垃圾回收
如
void funv() {
int *p = new int[128]
foo(p)
delete(p)
}
由于中间可能会发生执行流的跳转,导致内存泄漏的问题
手动管理的另外一个问题就是由于指针的到处传递而无法确定何时可以释放该指针所指向的内存块,假设代码中某个位置释放了内存,而在另外的地方,还在使用指向的内存块的指针,那么此时这个指针就是野指针或者又称为悬空指针,这些指针进行的任何读写操作都会导致不可预见的结果
为了解决手动管理内存的问题,出现了智能指针,来辅助管理内存
更好的解决方式就是语言层面上加上自动垃圾回收算法(gc)
所谓的垃圾回收就是,所有内存分配的动作都会在运行的时候记录,同时该内存的使用也会被记录,然后垃圾回收器会对所有的内存分配进行跟踪监测,一旦发现有些内存不在被人使用,就会阶段第回收这些没有被人使用的内存
具体的垃圾回收算法需要 后续深入的去了解
二.更丰富的内置类型
比如C++的内存类型是(整型和浮点型),go内置的类型有map,另外还新增了一个类型就是slice切片,其实和c++的vector类似,因为大多数人去使用,所以不需要重复的去包含map.vector等头文件,这样可以减少输入的工作量
三.函数多返回值
func getName()(name ,age,nickName string) {
name= "张三"
age = "20"
nickName = "小张"
}
还有一个优势就是,不是每一个返回值都必须赋值,没有明确的返回值将保持默认的空值
name,age,nickName := getName()调用
可以用下滑线表示自己不关系的值
_,_,nickNmae := getName()
四.错误处理
defer用于文件的读写,y以及paninc和recover用于完成错误的抛出和捕获,而不用一层的try-catch
五.匿名函数和闭包
go中,所有的函数类型都是值类型,可以作为参数传递,go支持常规的匿名函数和闭包
f := func(x,y int)int {
return x+y
}
六.类型和接口
go的类型就是和C语言的结构体相同,不支持重载和继承而是支持组合功能
在实现接口之前需要先实现接口,并且将类型和接口绑定
type iFly nterface {
Fly()//会飞的方法
}
type Bird struct {
..//信息
}
func(b *Bird)Fly() {
//以鸟的方式飞行
}
七.并发
//使用chan实现并发
func sum(value[] int,res chan int) {
var ret int = 0
for _,v:= range value {
ret+=v
}
res<-ret
}
func main() {
value := []int{1,2,4,5,3,6}
res := make(chan int,10)
go sum(value[:len(value)/2],res)
go sum(value[len(value)/2:],res)
sum1,sum2 := <-res, <-res
fmt.Println("sum1的结果 %d",sum1,"sum2的结果 %d",sum2)
}