1

01|前世今生:你不得不了解的Go的历史和现状

 2 years ago
source link: https://time.geekbang.org/column/article/426282
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
登录 后留言

精选留言(22)

  • e481ae48.jpg
    lesserror
    Tony Bai,你好。文章读完了,写的很好。关于文中有几点疑问,麻烦解答一下。

    1. “为 Go 语言实现了一个 gcc 的前端?” 怎么理解这个“前端”的意思。

    2. “这样,我们通过显式转型就可以让一个普通函数成为满足http.Handler接口的类型了。” 这里的“显示转型”该怎么理解呢?

    3. 能否解释一下“运行时”这个概念呢? 好多文章都是一笔带过,想知道到底是一个什么概念。

    作者回复: 这三个问题问的都非常棒👍

    这里是第一讲,因此很多技术术语可能没有更细致的解释,随着课程的展开,一些术语在后续的课程讲解中都会涉及到。

    既然提出这些问题了,我就来简单解答一下。

    第一个问题:什么是编译器的前端?在计算机专业编译原理课上大家可能都会学到一个编译器的完整编译过程包括:词法分析,语法分析,类型检查,中间代码生成,代码优化,目标代码生成,目标代码优化等几个阶段。从词法分析到中间代码生成,这就是编译器前端所要负责的事情。而代码优化和目标代码生成,则是编译器后端的职责。

    文中提到了实现了一个gcc的前端,就是实现了一个程序,这个程序可以读取go源码并通过词法分析、语法分析、类型检查,最终生成中间代码,而这个中间代码可以被gcc后端所识别并生成最终目标代码。

    第二个问题:什么是显式转型?这是一个语法层面的术语。举个简单例子,在Go中,如果一个变量的类型为int,但我要将其与另一个int64类型的变量进行加法运算,我们不能直接将它们相加,我们必须将它们显式的转换为同一类型后才能相加,这里的转换过程就简称为显式转型,这个例子转换为代码就是:

    var a int = 5
    var b int64 = 6
    c := int64(a) + b

    其中的int64(a)就是对变量a进行显式转型。

    第三个问题,什么是go运行时?

    go 运行时,也称为go runtime。

    它在那里?其本身就是每个go程序的一部分,它会跟你的源码一起编译并连接到目标程序中。即便你只是写了一个hello world程序,这个程序中也包含了runtime的实现。

    它在我的程序中具体负责什么?runtime负责实现go的垃圾收集、并发、内存堆栈管理以及Go语言的其他关键功能。

    它的代码在哪里?它大部分以标准库的形式存放在每个Go发布版的源码中。

    感谢对本专栏的支持!

    2021-10-13
    6
    60
  • eba94899.jpg
    罗杰2012c563b22c76a7f1f97c22c3ddf830.png
    相比 C/C++ 每个平台的支持问题,Go 的表现简直好太多了。但有个问题,我疑惑了好长好长时间了,希望 Tony 老师解答:printf 能格式化字符串,换行就要手动添加 "\n",println 又不能格式化字符串。我想知道为什么要这样的设计?在看我来这就是特别反人类的设定,Rust 的 println!("{}", a); 才是符合直觉的。

    作者回复: 净给我出难题😝

    这个问题我是这么看的,printf是go提供的标准格式化io的函数,它能实现你所期望的所有功能。与c语言的printf是对等的。但println这个函数你可以看成是一种“语法糖”,它本身就是一个特例,你可以用go doc看看println的manual,println原语义就是使用一种默认的格式输出数据到stdout上。你认同这种默认格式,你就使用println,简化你的代码。否则,你就用printf就好了。

    2021-10-14
    13
  • 62bfa83f.jpg
    go有吉祥物,其他2个语言没有
    2021-10-14
    8
  • 0a8bc27b.jpg
    我刚转到Go一个半月,之前主要做iOS开发。觉得App开发的天花板太低了,就坚决转型了。
    我看完《Go程序设计语言》和其它一些书,也上了极客时间的《Go训练营》。
    但是都没有很详细的提到Go的历史和现状,正如白老师所说,了解Go语言的前世今生能够对这门语言更有信心。很高兴今天加入这个专栏,赶上进度,跟着白老师好好学习。

    作者回复: 加油!

    2021-10-26
    4
  • d2efde18.jpg
    dapr也是go编写

    作者回复: 是的,微软牵头推出的云原生分布式应用开发框架dapr的默认实现就是用的Go。

    2021-10-13
    4
  • ea25d673.jpg
    西红柿牛男
    go有计划加入机器学习库吗?

    作者回复: 机器学习目前python一家独大。其他语言包括go都在努力抢市场份额。go在机器学习方面的成果还不那么显著,但从几个go机器学习相关的开源项目的活跃度来看,go社区还在积极努力。可以看看像gonum、spago这样的项目。

    2021-10-18
    2
  • a1a61f7c.jpg
    GAC·DU
    内存管理,Go协程,面向对象
    2021-10-14
    2
  • bd83bd4f.jpg
    Go 的但是是因为3个前辈在编译 C++ 的时候需要等待很久,在这段时间内他们交换了对一门新的语言的想法。

    有了想法,就有定义,于是他们开始设想 Go 的特性。如
    ● 编译速度提升
    ● 修复缺陷
    ● 摈弃C++不好的地方
    ● 补全想要的功能
    ● 并发能力

    为什么是 Go ?
    因为这个单词很简单。

    至于有人说 Golang,其实没有关系,Golang 仅仅是 Go 的官方网站,因为 go.com 被注册了。

    2008 年 Go 就诞生了,团队逐步扩大,2009 年开源,2009-11-10 被定为诞生日。
    Go 的吉祥物是地鼠,Go 程序员叫 Gopher。

    Go 能用在生产环境是有个节点 Go 1.5,这个版本解决了 Go 的 GC 回收问题。

    Go 的现状挺好的。
    现在的公司在用,而且公司的业务是对性能要求高的。
    前公司也是从 python 转型到 Go。
    而且之前的同事在转型到后台的时候也会选型 Go,也即是说会越来越多的公司在选择后端语言的时候会选择 Go。
    而且 Go 的程序员挺难招到的。
    我了解到 Docker 是用 Go 写的。
    从大数据来看一门语言的生命周期,也能看得出来在 5 年内 Go 会引来爆发期。
    云也倾向于 Go 语言。

    作者回复: 👍

    2022-01-13
    1
  • 132
    先掌握概念再慢慢消化。
    2021-10-15
    1
  • 132
    Geek_8ed998
    更新节奏是一周几更啊

    编辑回复: 每周一、三、五各更新一讲

    2021-10-13
    1
  • 3e319cad.jpg
    相比c和c++ ,go有了垃圾回收,更快的编译速度
    2021-10-13
    1
    1
  • cc05ebc7.jpg
    tonybai预言帝,1.18泛型支持测试版本已经发布了,我也立马装上体验了

    作者回复: 👍

    2021-12-22
  • 828a431f.jpg
    听到老师的东北口音实在太亲切了,哈哈哈~ 十分认同老师对 Go 语言前景的展望,希望老师推荐几本 Go 语言的书籍作为课程之外的补充。

    作者回复: 👍 在后面的加餐中有关于参考书籍的介绍。

    2021-12-01
  • ad02ae4b.jpg
    python要转GO!
    2021-11-29
  • ff5c52ad.jpg
    整体感觉就是 Go 删繁就简,精简化而不失强大特性,让每个 Gopher 快乐高效编程。两大特色:构建速度和真正地支持多处理器
    2021-11-07
  • 51c1b2f0.jpg
    老师好,我是前端开发人员,大学里第一门语言是java, 但是后来觉得写java太重了,写起来累,后面就转到前端了,写了3-4年的前端了,心里一直觉得想捡起一门后端语言,觉得老是写页面,天花板太低了,在技术群里看到好几个朋友的分享就进来看了,觉得老师开篇讲的真好,感觉对比java和C的繁重,go的语法和js很像,有点动态语言结合了静态语言类型那种感觉,但具体又有类型上的区别,之前看过一些go的基础语法,但是不是很系统,决心跟着老师好好学,努力提高自己的上限。

    作者回复: 既然选择了重学后端语言,而且选择了go,那就跟上学习进度。学习后,你肯定会有收获的。

    2021-11-04
  • ffd16123.jpg
    老师,作为JAVA语言开发者,如果想要研究k8s、云原生领域,go语言需要掌握到什么程度呢?

    作者回复: Go入门后,就基本可以看懂大部分Go应用层源码。如果要研究k8s、docker等平台的原理,那么还有一些网络、存储等语言之外的东西需要学习。

    2021-10-26
    2
  • 5960a2af.jpg
    Java工作,趁着有点时间学习下go,多了解了解,总没坏处

    作者回复: 你的选择没错!

    2021-10-25
  • be778bb8.jpg
    春是春天的春
    易上手、编译构建简单、支持并发的场景
    2021-10-25
  • ccb37425.jpg
    了解历史是很有必要的。但是,往往听到别人说看了也记不住,这其实没必要,知道有这么回事就行~
    2021-10-20
收起评论

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK