最基础的 go 并发编程题,难倒了 90%的候选人

207 天前
 yuanyao

两个 goroutine 用 channel 通信,一个 goroutine 顺序发送 0,1,2,3,4 个数字,另一个 goroutine 接收并输出。 考察了 goroutine 的控制、channel 的关闭等基础知识,面试者写的代码各种问题。

  1. 有的 goroutine 还没启动程序就退出了,提示后仍想不到使用 waitgroup ,context ,done channel 等手段,而是用 time sleep 等待;
  2. 有的 channel 不知道由生产者关闭,直接在主程序生产者还未发送结束就关闭结果 panic ;
  3. 有的不会检查消费者读关闭 channel 的返回值,程序直接死循环死锁。

上周面试 5 个人只有 1 个人一次写出了执行没问题的代码,有 1 个经过提示也没写出来,剩下的能提示后逐步修改出正确的代码。

这个题还是很经典的,不用问 GMP 、垃圾回收算法等八股文,这个题就能看出 go 基础了。

11998 次点击
所在节点    Go 编程语言
108 条回复
ericcen
205 天前
@body007 中文也是自带的吗
body007
204 天前
@ericcen 以前的版本要装中文插件,最新版全部自带中文额。
felixfw1111x
204 天前
package main

import "fmt"

func main() {
ch, done := make(chan int), make(chan bool)

go func() {
for i := 0; i <= 4; i++ {
ch <- i
}
close(ch)
}()

go func() {
for i := range ch {
fmt.Print(i, " ")
}
done <- true
}()

<-done
}
harlen
202 天前
func TestPrint(_ *testing.T) {
ch := make(chan int)
done := make(chan struct{})
go func() {
defer close(ch)
for i := 0; i < 5; i++ {
ch <- i
}
}()
go func() {
end:
for {
select {
case v, ok := <-ch:
if !ok {
fmt.Println("close ch")
break end
}
fmt.Println(v)
default:
//兜底处理
}
}
done <- struct{}{}
}()
<-done
}

这玩意,web 方向除了专门练习过,日常哪有业务需要用到 goroutinue. 游戏方向异步刷库,优先级任务这些可能会用到,大部分还是用来做基础设施可能用到的。很多专注业务处理的业务仔,都是前面被这些面试题坑了之后,再回去练习的。

就比如面试的时候,遇到个问题
var a := [...]int{1, 2, 3, 4, 5, 6} 是数组还是切片。

func PrintA(nums []int){
fmt.Println(nums)
}
PrintA(a) 会报错吗
0x3751
201 天前
初级水平:使用基本的 channel 使用
中级水平:使用 sync.WaitGroup ,展示标准库同步原语的应用
高级水平:使用 done channel 或 context
Miranquil
154 天前
这个还需要用 waitGroup 吗?
楼主是不是忘了 channel 本身就是可以造成阻塞的一种方式?

```go
package main

import "fmt"

func main() {
c1 := make(chan int)
c2 := make(chan int)

go func() {
for i := 1; i != 5; i++ {
c1 <- i
}
close(c1)
}()

go func() {
for n := range c1 {
c2 <- n
}
close(c2)
}()

for n := range c2 {
fmt.Println(n)
}
}
```
Miranquil
154 天前
@0x3751 反了。最高级水平是不利用任何 select, sync, done ,纯靠题目给的两个 channel 本身的阻塞效力。
Miranquil
154 天前
我的锅,光顾回复了,一层层下来还真有点理解 OP 了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1113786

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX