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

2025 年 2 月 24 日
 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 基础了。

13255 次点击
所在节点    Go 编程语言
108 条回复
NerdHND
2025 年 2 月 24 日
拿我得指出哥们候选人真的有问题吧, 这, 这不是完全不会嘛...
hingle
2025 年 2 月 24 日
薪资给多少?薪资低那就 “门当户对” 了,挺好的。
kandaakihito
2025 年 2 月 24 日
看了一下,上周那个 “一面出 LRU 算法题算难吗” 的帖子也是你发的。老哥你负责面的到底是什么类型岗位呀?怎么题目差距好像有点儿大。

而且说实话,如果给你投简历的人里面,有 80%连 chan 的基础都用不清楚。。。那么你这个岗位面试的时候应该不适合问 LRU 。
nomagick
2025 年 2 月 24 日
你也别有莫名的优越感然后老来收铜币;
先用务实标准筛选一下吧,统招本科四六级,3 年经验之类的
Keystroke
2025 年 2 月 24 日
time.sleep……
clemente
2025 年 2 月 24 日
如果说从通过率分布的角度来定义 题的难度的话
90% 应该算 hard
fruitmonster
2025 年 2 月 24 日
虽然知道应该使用 waitgroup ,但是, "time sleep " 没解决没执行完就退出这个问题么?
jr55475f112iz2tu
2025 年 2 月 24 日
钓鱼上瘾是病,得治
xuanbg
2025 年 2 月 24 日
你这个不叫 go 基础,就是个编程基础。
jworg
2025 年 2 月 24 日
可以用第三方库不,我脑子已经被 conc 惯坏了,只记得起 conc 的 WaitGroup , 系统的 WaitGroup 好像属于 sync 包。
langhuishan
2025 年 2 月 24 日
golang 的精髓不就是并发吗?这都没掌握,等于没学
cooooing
2025 年 2 月 24 日
@fruitmonster time sleep 只是降低出现这个问题的概率,并没有解决问题。如果操作是请求 api 或者其他耗时操作,要 sleep 多久?这种方式不好的,还是得 wait group 或者其他方式来同步
Vegetable
2025 年 2 月 24 日
这种情况至少说明完全没做过需要 graceful shutdown 的程序,不能说判死刑,但至少对 go 不太了解吧
freemoon
2025 年 2 月 24 日
可以说说招聘岗位要求几年经验,给多少薪资
zljklang
2025 年 2 月 24 日
package main

import "fmt"

func main() {
// 创建无缓冲通道
ch := make(chan int)

// 发送方 goroutine
go func() {
for i := 0; i < 5; i++ {
ch <- i // 顺序发送数字
}
close(ch) // 发送完成后关闭通道[1,7](@ref)
}()

// 接收方 goroutine
for num := range ch {
fmt.Println("Received:", num)
}
}
这个对吗
givenge
2025 年 2 月 24 日
天天发这些,不会是想转自媒体吧
opengps
2025 年 2 月 24 日
对于你的状态来考他们不合格,那反过来他们提问题考验你你有信心通过吗?
单个问题并不能说明人的整体能力
hunterster
2025 年 2 月 24 日
package main

import (
"fmt"
"sync"
)

func writeData(c chan int, i int) {
c <- i
}

func readData(c chan int) {
for i := 0; i < 5; i++ {
fmt.Println("The data is:", <-c)
}
}

func main() {
var wg sync.WaitGroup
wg.Add(5)

var c = make(chan int)

for k := 1; k <= 5; k++ {
go func() {
defer wg.Done()
writeData(c, k)
}()
}

go readData(c)

wg.Wait()
close(c)
}
codersdp1
2025 年 2 月 24 日
这个确实属于 go 基础了,没掌握这些写并发功能肯定会出问题的。
voidmnwzp
2025 年 2 月 24 日
```go
func Test2(t *testing.T) {
s := make(chan int)
go func() {
for i := range s {
fmt.Println("recv:",i)
}
}()
for i := 0; i < 5; i++ {
s <- i
}
close(s)
}
```
不是这和 1+。。100 求和有啥区别 很难吗

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

https://study.congcong.us/t/1113786

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

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

© 2021 V2EX