原文地址:Go面试看这里了~(二)
1、Go同步锁(Mutex)的特点、作用?
当goroutine(协程)获得Mutex后,其它goroutine只能等待,除非该goroutine释放该Mutex,RWMutex在读锁占用时会阻止写,但不阻止读,RWMutex在写锁占用时会阻止其它任何goroutine读写,整个锁相当于由该goroutine独占。
同步锁的作用是保证资源在使用时的独有性,不会因为并发导致数据错乱,保证系统稳定性。
2、channel(通道)的特点?
-
给nil的channel发送数据会造成永久阻塞。
-
从nil的channel中接受数据会造成永久阻塞。
-
给已close的channel发送数据会导致程序panic。
-
从已close的channel接收数据,如缓冲区为空,则返回零值。
3、channel缓冲有什么特点?
无缓冲的channel是同步的,有缓冲的channel则是非同步的。
4、cap可作用于哪些数据类型?
-
Array(数组)。
-
Slice(切片)。
-
Channel(管道)。
5、Go convey是什么?
-
支持Go的单元测试框架。
-
能自动监控文件修改并启动测试,可将测试结果实时输出到Web页面。
6、new和make的区别?
下来看下它们的定义:
func new(Type) *Type
func make(t Type, size ...IntegerType) Type
上述定义中的Type代表某一数据类型。
可看出new返回是指向Type的指针,make直接返回Type类型值或者说实例。
再来从入参这方面看的话,new只有一个Type参数,Type可以是任意类型数据,而 make可有多个参数,其中第一个参数与new的参数相同,但是只能是slice,map,chan三者之一。
make的size参数根据前面参数的数据类型的不同而产生不同的含义,如下:
-
对于slice,第一个size表示长度,第二个size表示容量,且容量不能小于长度,如果省略第二个size,则默认容量等于长度。
-
对于map,会根据size大小分配资源,以足够存储size个元素,如果size,会默认分配一个小的起始size。
-
对于chan,size为缓冲区容量,如省略size,则channel为无缓冲channel。
7、Printf(),Sprintf(),FprintF()都是格式化输出,有什么不同?
-
Printf是标准输出,一般是屏幕,也可以重定向。
-
Sprintf是将格式化字符串输出到指定字符串中。
-
FprintF是将格式化字符串输出到文件中。
总结一句话就是:虽然三种函数都是格式化输出,但是输出目标不一致。
至此,本次分享就结束了,后期会慢慢补充。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
以上均为个人认知,如有侵权,请联系删除。