Golang面试题详解(四):Map、Channel、WaitGroup常见陷阱及Struct比较
Golang题库(四)
map取一个key,然后修改这个值,原map数据的值会不会变化?
map属于引用类型,所以取一个key,然后修改这个值,原map数据的值会发生变化
向为nil的channel发送数据会怎么样
空通道即无缓冲通道。无缓冲通道上的发送操作将会阻塞,直到另一个goroutine在对应的通道上执行接收操作,这时值传送完成,两个goroutine都可以继续执行。相反,如果接收操作先执行,接收方gorountine将阻塞,直到另一个goroutine在同一个通道上发送一个值。
使用无缓冲通道进行的通信导致发送和接收goroutine同步化。因此,无缓冲通道也称为同步通道。当一个值在无缓冲通道上传递时,接收值后发送方goroutine才被再次唤醒。
WaitGroup的坑
Add一个负数
如果计数器的值小于0会直接panicAdd在Wait之后调用
比如一些子协程开头调用Add结束调用Wait,这些 Wait无法阻塞子协程。正确做法是在开启子协程之前先Add特定的值。未置为0就重用
WaitGroup可以完成一次编排任务,计数值降为0后可以继续被其他任务所用,但是不要在还没使用完的时候就用于其他任务,这样由于带着计数值,很可能出问题。复制waitgroup
WaitGroup有nocopy字段,不能被复制。也意味着WaitGroup不能作为函数的参数。
go struct 能不能比较
需要具体情况具体分析,如果struct中含有不能被比较的字段类型,就不能被比较,如果struct中所有的字段类型都支持比较,那么就可以被比较。
不可被比较的类型:
① slice,因为slice是引用类型,除非是和nil比较
② map,和slice同理,如果要比较两个map只能通过循环遍历实现
③ 函数类型
其他的类型都可以比较。
还有两点值得注意:
- 结构体之间只能比较它们是否相等,而不能比较它们的大小。
- 只有所有属性都相等而属性顺序都一致的结构体才能进行比较。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 盗计のBlog!
评论