Go基础问题汇总
1.cap()和len()函数的区别是什么?
len()返回切片中的元素个数。 cap()返回切片中容量即切片可以容纳的元素个数。
2.select作用:
随机选择一条没有被读写阻塞的case加以执行,通常是管道IO;
3.主协程如何等其余协程完再操作?
等待组(sync.WaitGroup) 和 管道(channel );10个子协程,子协程结束任务,向一个切片中写入true,主协程循环查看切片的长度,为10时退出。
4.什么情况下会死锁,如何避免?
死锁(主协程被阻塞);
如何避免:
不能单个协程,自读自写一个没有缓冲能力的管道。
A协程要求B协程先写入,自己再读出;B协程要求A协程先读出,自己在写入,此时AB死锁。
range channel时,要注意channel的写入关闭,如果不关闭管道,range channel就永远阻塞。
实例:https://blog.csdn.net/Chen_Jeep/article/details/109534566
5.Go的channel,有缓冲和无缓冲的区别是什么?
有缓冲的管道,即使没写入,也能读出若干默认值,即使没人读出,也能写入若干值。
无缓冲的管道,只要没有协程写入就读出,会阻塞。没有协程读出,就造成写入阻塞。
6.go可以怎么做到同步调度?
通过管道的读写阻塞实现同步。
通过Timer或者Ticker实现固定时长阻塞或周期定期阻塞。
读写锁的强锁与释放阻塞
sync包下的同步机制:
等待组(wg.wait() 直到wg中所有的协程全部wg.Done())。
条件变量,cond.wait()直到有cond.singal()或cond.broadcast()。
Once.Do(func)保证只执行一次。
通关原子操作保证对基本类型变量的操作是同步的。
7.比较一下go run /build/get/install 几个命令的异同
go run xxx.go:直接编译并运行go文件,产生的可执行程序在临时文件夹中。
go build xxx.go:在当前目录产生同名的可执行程序。
go get mypack: 下载包源码到当前GOPATH/src目录下
go install mypack:对指定包进行编译安装。如果有main主程序,则在当前GOPATH/bin下生产可执行程序。
8.一个通过make()命令创建的缓冲区被分配了一块内存后。如何销毁缓冲区并回收内存?
buffer = nil -> 在运行时,buffer = nil将重启垃圾回收。
make()能创建的类型包括:切片,map,管道,三至都是引用类型。
引用类型的值的内存分配是在堆中的,栈中使用一个地址。需要回收时,将指针或引用指向为nil即可。
8.什么是值传递和引用传递
Go语言中的引用类型:切片,map,管道,指针,接口;其都是值类型。
在变量(函数传递)传递时,值类型时拷贝,引用类型时地址传递。
参考:https://blog.csdn.net/bingshiwuyu/article/details/107042158