Go 最难的问题这次都能给你解决

共 1737字,需浏览 4分钟

 ·

2021-06-22 13:40

最近我写了一篇《迷惑的 goroutine 执行顺序》文章,里面有道非常“简单”的看代码写输出的题目:

package main

import (
 "fmt"
 "runtime"
 "time"
)

func main() {
    runtime.GOMAXPROCS(1)
    for i := 0; i < 10; i++ {
        i := i
        go func() {
            fmt.Println(i)
        }()
    }

    var ch = make(chan int)
    <- ch
}

果你了解一点 Go 协程的机制、知道一些调度的知识,确实非常容易。但是如果你只是习惯于堆业务代码,那肯定无从下手,面试直接 gg。

后来我又做了一个动画,简单明了。当然,结合《Go 调度的本质》这篇文章来看会理解地更深刻。无非就是 Go 调度的三级队列:runnext, local runqueue, global runqueue。相信看完马上就明白了。


Go 作为下一个企业级编程语言,他的发展趋势想必也不需要我这里赘述了。毕竟你只要稍稍了解就能知道,Go 语言的前景有多么光明了。


作为云原生体系开源项目的首选语言,虽然他的优势之一就是容易上手,但目前有很多 Go 初级工程师在面试大厂 Go 工程师岗位,或者是在使用 Go 落地到项目中时,都不约而同的被 4 点问题难住:



1

Go 没有 Java 成熟统一的框架,大规模使用 Go 进行业务开发时,许多人认为也不应该从使用框架开始,这就给统一的项目标准化带来了挑战。



2

Go 通过函数和预期的调用代码简单地返回错误(或返回调用堆栈)来帮助开发者处理编译报错。虽然这种方法是有效的,但很容易丢失错误发生的范围,因此我们也很难向用户提供有意义的错误信息。在 Go 中如何结合 error 的特性比较妥善的处理业务异常、错误码,形成统一的异常处理,也是比较困难的一个问题。



3

Go 在语言层面提供了并发协程的机制,如果你不了解其中的机制,仅仅按照线程的套路来使用,就发挥不出来 Goroutine 的优势,甚至还会导致很多性能问题。Goroutine 的生命周期管理、元数据传递、并发控制、配合 Goroutine 的网络编程都有不少的细节和难点,这些都需要花大量时间学习和实践,才能熟练掌握。


4

如何使用 Go 来高效地构建当前流行的微服务架构,解决效率、可用性、一致性等问题,这里面也有不少坑要踩,这些东西很难通过看几本书或者看几篇文章来学到。


我相信正在看这篇文章的你,或多或少一定也在因为相同的问题而犯难。这里有场免费学习活动,一定可以帮到你


6月21-6月27日,极客时间训练营 Go 主题学习周,一周 5 天 ,5 位业内 Go 语言重量级专家将为你带来一场围绕 Go 语言的沉浸式直播体验。


更多活动详情,详见下图👇






浏览 35
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报