某大厂 golang 一面凉经 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
klusfq
V2EX    职场话题

某大厂 golang 一面凉经

  •  1
     
  •   klusfq 240 天前 4166 次点击
    这是一个创建于 240 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    六年后端经验,目前二线城市找机会回一线。

    流程

    1. 自介绍
    2. golang 八股文:
      • GMP 原理
      • 协程和线程区别
      • 带 buffer 和不带 channel 使用
      • GC 原理
      • 利于 gc 的最佳实践
    3. 十分钟写快排;
    4. 聊了一个项目:docker-compose 项目落地到 K8S ;

    感受

    • 首先,我面的是云原生岗位,亏我还重点看网络/docker/k8s ,结果这方面啥都没问,有点小蛋疼;
    • 然后,Go 八股答的不好,尤其利于 GC 的最佳实践问题;
    • 最后,当时说十分钟写快排,我脑子就已经宕机了(心态问题),根本没法集中注意力;

    PS:事后我冷静下来,回忆思路大概花了 10+分钟,然后整个 coding 过程也就 15+分钟吧。

    心态很重要!心态很重要!心态很重要!

    func QuickSort(arr []int) { if len(arr) == 0 { return } fmt.Println(arr) pv := 0 pl := 1 pr := len(arr) - 1 for pl <= pr { if pv < pl { // -- 右边 for arr[pv] < arr[pr] { pr -= 1 } arr[pv], arr[pr] = arr[pr], arr[pv] pv = pr pr -= 1 // fmt.Println(arr, pl, pr, pv) } else if pv > pr { // -- 左边 for arr[pv] > arr[pl] { pl += 1 } arr[pv], arr[pl] = arr[pl], arr[pv] pv = pl pl += 1 // fmt.Println(arr, pl, pr, pv) } } QuickSort(arr[:pv]) QuickSort(arr[pv+1:]) } 
    第 1 条附言    239 天前
    以上快排代码存在 pv/pl/pr 的数组越界 bug ,对边界 case 未妥善处理,仅供参考!!!
    27 条回复    2025-04-18 10:38:58 +08:00
    BenWang
        1
    BenWang  
       240 天前
    35+ 以后不打算面试了,没上进心了,等被裁,然后躺平。
    lasuar
        2
    lasuar  
       240 天前
    没准备到位。
    klusfq
        3
    klusfq  
    OP
       240 天前
    @BenWang 躺平也是要资格的,我也快而立之年了,房贷压身、身不由己。趁最后几年再搏一把......
    klusfq
        4
    klusfq  
    OP
       240 天前
    @lasuar 根本没准备 go 八股文。。。
    xuzhzzz
        5
    xuzhzzz  
       240 天前
    云原生岗位就谈了个 docker-compose 项目落地到 K8S 吗
    emSaVya
        6
    emSaVya  
       240 天前
    一面挂确实太伤了。大概率以后都没机会再面了。
    ldx78203199
        7
    ldx78203199  
       240 天前
    讲道理 一面问题不难,快排算是送分题
    hahasong
        8
    hahasong  
       240 天前
    还是第一次见这样写快排,这比较条件很绕
    Yc1992
        9
    Yc1992  
       240 天前
    你这快排复盘都没写对
    youyouzi
        10
    youyouzi  
       239 天前
    为什么你的快排写这么复杂啊?

    function quickSort(arr) {
    if (arr.length <= 1) {
    return arr;
    }

    const pivot = arr[0];
    const left = [];
    const right = [];

    for (let i = 1; i < arr.length; i++) {
    if (arr[i] < pivot) {
    left.push(arr[i]);
    } else {
    right.push(arr[i]);
    }
    }

    return [...quickSort(left), pivot, ...quickSort(right)];
    }

    这样不是蛮简单?
    youyang
        11
    youyang  
       239 天前
    有时候也靠运气
    klusfq
        12
    klusfq  
    OP
       239 天前
    @ldx78203199
    主要是太久没写,加上大脑宕机了,确实可惜。。。
    klusfq
        13
    klusfq  
    OP
       239 天前
    @Yc1992
    ???
    klusfq
        14
    klusfq  
    OP
       239 天前
    @youyouzi
    那是因为我考虑了空间复杂度。。。
    你这开了这么多数组,排序数组稍微大点就爆栈好伐。。。
    klusfq
        15
    klusfq  
    OP
       239 天前
    @hahasong
    我是按自己六年前大学的记忆理解写的
    klusfq
        16
    klusfq  
    OP
       239 天前
    @xuzhzzz
    他根本没问云原生这方面的问题,那还是我提到自己项目,聊了聊。
    感觉他就只想看看你 go 有没有背八股
    klusfq
        17
    klusfq  
    OP
       239 天前
    @emSaVya
    没事儿,就当积攒经验了
    klusfq
        18
    klusfq  
    OP
       239 天前
    @youyang
    只能说没这个缘分,尽人事听天命吧。
    Yc1992
        19
    Yc1992  
       239 天前   1
    @klusfq #13
    for arr[pv] > arr[pl] {
    pl += 1
    }
    当 pv=0, 所有 arr[pl]都< arr[0] 的时候,index 直接越界了

    你有打的功夫 不如自己问问 ai 代码哪里有问题
    allencloud
        20
    allencloud  
       239 天前
    GC 的最佳实践问题 怎么问的,应该怎么答?让我抄抄答案。。。
    太惭愧了,自己在中厂,OOM 都是通过加容器内存解决的。。。
    klusfq
        21
    klusfq  
    OP
       239 天前
    @Yc1992
    首先,我很感谢你指出我 coding 的问题;
    其次,这个代码我基本就是回忆+vi 裸写,快速过了面试官 case 就到此为止了;
    再次,你如果愿意指教就别卖关子,不愿意也无所谓;
    最后,发帖本来就是为了分享经验,社区交流本来就互通有无,请别以那种高高在上的姿态在那儿点评;

    PS:边界 case 没处理到位这是 bug ,至少思路没错,不知道你的优越感打哪儿来的。
    klusfq
        22
    klusfq  
    OP
       239 天前
    @allencloud
    在 Go 语言中编写 GC 友好的代码是优化程序性能的关键。以下是一些实践建议,旨在减少垃圾收集器的压力并提高程序的运行效率:
    1. 对象池复用:对于频繁创建和销毁的小对象,可以使用对象池来复用对象,避免频繁的内存分配和回收。但需注意,对象池不适合所有场景,特别是对象较大或内存管理复杂时,可能会增加同步开销。
    2. 避免短生命周期的大对象:尽量减少大对象的临时使用,因为它们会快速晋升到老生代,增加 GC 的负担。
    3. 控制并发内存分配:在高并发场景下,过多的并发内存分配会增加 GC 的频率,考虑使用同步池等机制来集中管理内存分配。
    4. 减少不必要的指针使用:无指针值的传递和存储可以减少 GC 的工作量,尤其是在数据结构中,如果不需要通过指针访问,尽量使用值类型。
    5. 结构体字段布局优化:将指针字段放在结构体的前面,非指针字段放在后面,这样 GC 可以更快地完成扫描。
    6. 利用逃逸分析减少分配:理解逃逸分析的工作原理,编写代码以避免不必要的堆分配。可以通过编译器标志(如-gcflags=-m )来查看哪些对象逃逸到了堆上,并尝试优化。
    7. 字符串拼接避免使用+或 fmt.Sprintf:频繁的字符串拼接会导致大量临时字符串对象的生成,考虑使用 strings.Builder 或 bytes.Buffer 来累积字符串。
    8. 合理设置 GC 参数:根据应用的具体情况调整 GC 的参数,如设置合适的堆增长因子、调整 GC 触发的阈值,但需谨慎,不当的调整可能适得其反。
    9. 并发标记与清理:了解 Go 的 GC 机制,特别是从 Go 1.5 版本开始引入的三色标记法及其并发收集的改进,这有助于理解为何某些代码实践对 GC 友好。
    10. 避免内存泄漏:确保所有资源在不再需要时被正确释放,避免长时间持有无用的对象引用,这直接关系到 GC 的效率。


    来自 deepseek
    kivmi
        23
    kivmi  
       236 天前
    @youyouzi 你这个空间复杂度上去了,最好还是使用原地快排,楼主那个是原地快排

    func quickSortInPlace(arr []int, low, high int) {
    if low < high {
    p := partition(arr, low, high) // 分区操作
    quickSortInPlace(arr, low, p-1)
    quickSortInPlace(arr, p+1, high)
    }
    }

    func partition(arr []int, low, high int) int {
    pivot := arr[high] // 选最后一个元素为主元
    i := low
    for j := low; j < high; j++ {
    if arr[j] < pivot {
    arr[i], arr[j] = arr[j], arr[i] // 交换
    i++
    }
    }
    arr[i], arr[high] = arr[high], arr[i] // 主元归位
    return i
    }
    youyouzi
        24
    youyouzi  
       235 天前
    @klusfq #14
    @kivmi 好吧,是我肤浅了。没考虑性能问题。直接上手干了
    YakumoZi
        25
    YakumoZi  
       234 天前
    @klusfq #22 不要直接粘贴 AI 回复哦,小心被 BAN
    JZ8ZW193q6W9Awgy
        26
    JZ8ZW193q6W9Awgy  
       234 天前
    @klusfq #3 有房贷真的是一把枷锁,让人不能动弹。。。
    klusfq
        27
    klufq  
    OP
       224 天前
    @YakumoZi
    好的,感谢提醒~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     881 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 22:12 PVG 06:12 LAX 14:12 JFK 17:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86