Go面试题答案与解析

14 个评论

大神又看到你了,昨天刚看到的笔试题有几个不太了解,你今天就全部讲解了下,赞!!!
写的很不错,但我纠正一个问题:
关于 9、下面的迭代会有什么问题?
”内部迭代出现阻塞。ch 初始化的容量默认为1,如果外部不及时读取,则内部迭代是阻塞状态。“
不能这样去理解吧?

ch := make(chan interface{}) 和 ch := make(chan interface{},1)是不一样的

无缓冲的 不仅仅是只能向 ch 通道放 一个值 而是一直要有人接收,那么ch <- elem才会继续下去,要不然就一直阻塞着,也就是说有接收者才去放,没有接收者就阻塞。

而缓冲为1则即使没有接收者也不会阻塞,因为缓冲大小是1只有当 放第二个值的时候 第一个还没被人拿走,这时候才会阻塞
这波操作,我给个赞
文中第十题!
这个考点是很多人忽略的interface内部结构。
go中的接口分为两种一种是空的接口类似这样:
```
var in interface{}
```
另一种如题目:
```
type People interface {
Show()
}
```
他们的底层结构如下:
```
type eface struct { //空接口
_type *_type //类型信息
data unsafe.Pointer //指向数据的指针(go语言中特殊的指针类型unsafe.Pointer类似于c语言中的void*)
}
type iface struct { //带有方法的接口
tab *itab //存储type信息还有结构实现方法的集合
data unsafe.Pointer //指向数据的指针(go语言中特殊的指针类型unsafe.Pointer类似于c语言中的void*)
}
type _type struct {
size uintptr //类型大小
ptrdata uintptr //前缀持有所有指针的内存大小
hash uint32 //数据hash值
tflag tflag
align uint8 //对齐
fieldalign uint8 //嵌入结构体时的对齐
kind uint8 //kind 有些枚举值kind等于0是无效的
alg *typeAlg //函数指针数组,类型实现的所有方法
gcdata *byte
str nameOff
ptrToThis typeOff
}
type itab struct {
inter *interfacetype //接口类型
_type *_type //结构类型
link *itab
bad int32
inhash int32
fun [1]uintptr //可变大小 方法集合
}
```
可以看出iface比eface 中间多了一层itab结构。
itab 存储_type信息和[]fun方法集,从上面的结构我们就可得出,因为data指向了nil 并不代表interface 是nil,
所以返回值并不为空,这里的fun(方法集)定义了接口的接收规则,在编译的过程中需要验证是否实现接口
谢谢支持
ysqi

ysqi 回复 fiisio

你说的非常对,不是容量的概念。
第三道题中的runtime.GOMAXPROCS(1)是有作用的,用自己电脑别用在线测试,因为在线测试限制了CPU数量为1。play.golang.com也做了限制。
基本同意答案。
第8题,应该有两个问题,一是读没加锁并发操作时可能panic;二是写操作是没有检查map是否为nil,如果为nil需要先make。
第10题,应该还有个知识点,就是golang的不可寻址值。
var peo People = Student{}。这个操作后,peo的value中保存了一个Student{}的结构体,但它是不可寻址的,类似map[int]Student中的值是不可寻址一个道理。因为Speak的接收者是一个指针,所以它是没有实现这个接口的。
第3题明显不对吧?首先runtime.GOMAXPROCS(1)是有作用的,并且起作用后输出的结果顺序是固定的,因为go程在被调度使用前是放在一个有序的队列中的。
ysqi

ysqi 回复 npchp110

第8题:并发读Map是不会panic的,只有在并发读写时才有引起竞争。
第10题:这个和不可寻址没关系,更多的是方法实现是基于指针的,而非值类型
fiisio

fiisio 回复 hmly

不要误导大家,虽然你每次是固定的,但是这个序列仍然是一个随机的,即使是伪随机。
第3题建议博主重新编辑答案,可以参考文章:https://zhuanlan.zhihu.com/p/27343468
hmly

hmly 回复 fiisio

不对吧,我看go程的调度,应该是放在一个有序队列里面的,如果你只用一个内核线程来跑这些go程的话应该是有序的。当有多个内核线程来相互“偷”go程队列里面的go程来执行时才会发生随机现象。
第9题,阻塞算是问题吗?有些场景就是需要阻塞

要回复文章请先登录注册