V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
yuanyao
V2EX  ›  Go 编程语言

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

  •  5
     
  •   yuanyao · 35 天前 · 10320 次点击
    这是一个创建于 35 天前的主题,其中的信息可能已经有所发展或是发生改变。

    两个 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 基础了。

    第 1 条附言  ·  35 天前
    工作职责
    1. 参与后端系统搭建与架构设计,保证其可扩展性,稳定性;为业务快速迭代提供保障;
    3. 作为业务 owner ,负责准时和高质量的交付;
    4. 根据业务需要,对后续架构的设计作出规划。
    任职要求
    1. 本科及以上学历,计算机科学、软件工程、信息技术或相关专业。
    2. 扎实的编程基础和良好的编码习惯,热爱编程,有 Go 或 Java 开发经验。
    3. 对产品有较好的理解,能够以用户体验为核心驱动力进行开发。
    4. 具备一定的系统架构设计能力,熟悉后端开发技术:协议、架构、存储、缓存、安全、消息队列等。
    5. 具备良好的沟通能力和团队合作精神,积极乐观,认真负责。
    105 条回复    2025-03-02 15:50:31 +08:00
    1  2  
    ericcen
        101
    ericcen  
       32 天前 via iPhone
    @body007 中文也是自带的吗
    body007
        102
    body007  
       32 天前
    @ericcen 以前的版本要装中文插件,最新版全部自带中文额。
    felixfw1111x
        103
    felixfw1111x  
       32 天前
    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
        104
    harlen  
       29 天前
    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
        105
    0x3751  
       29 天前
    初级水平:使用基本的 channel 使用
    中级水平:使用 sync.WaitGroup ,展示标准库同步原语的应用
    高级水平:使用 done channel 或 context
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4730 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:47 · PVG 17:47 · LAX 02:47 · JFK 05:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.