2021-03-23

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值