导读 | 写给0基础入门的Go语言学习者

你好,我是郝林,今天我分享的内容是:0基础的你,如何开始入门学习Go语言。

1. 你需要遵循怎样的学习路径来学习Go语言?

我们发现,订阅本专栏的同学们都在非常积极的学习和讨论,这让我们非常欣慰,并且和你一样干劲十足。不过,我在留言中发现,大家的基础好像都不太一样,大致可以分为这么几类。

  • 零基础的同学:可能正准备入行或者刚刚对编程感兴趣,可以熟练操作电脑,但是对计算机、操作系统以及网络方面的知识不太了解。
  • 无编程经验或者编程经验较少的同学:可能正在从事其他的技术相关工作,也许可以熟练编写脚本,但是对程序设计的通用知识和技巧还不太了解。
  • 有其他语言编程经验的同学:可能已成为程序员或软件工程师,可以用其他的编程语言熟练编写程序,但是对Go语言还不太了解。
  • 有一定Go语言编程经验的同学:已有Go语言编程基础,写过一些Go语言程序,但是急需进阶却看不清途径。

基于以上分类,我为大家制定了一份Go语言学习路径。不论你属于上面的哪一类,都可以按照此路径去学习深造。具体请看下面的思维导图。

(长按保存大图)

2. 学习本专栏前,你需要有哪些基础知识储备?

在这个专栏里,我会假设你有一定的计算机基础,比如,知道操作系统是什么、环境变量怎么设置、命令行怎样使用,等等。

另外,我还会假定你具备一点点编程知识,比如,知道程序是什么、程序通常会以怎样的形式存在,以及程序与操作系统和计算机有哪些关系,等等。

对了,还有在这个早已成熟的移动互联网时代,想学编程的你,一定也应该知道那些最最基本的网络知识。

我在本专栏里只会讨论Go语言的代码和程序,而不会提及太多计算机体系结构或软件工程方面的事情。所以你即使没有专门学过计算机系统或者软件工程也没有关系,我会尽量连带讲一些必要的基础概念和知识。

从2018年开始,随着Google逐渐重回中国,Go语言的官方网站在Google中国的域名下也有了镜像,毕竟中国是Go语言爱好者最多的国家,同时也是Go语言使用最广泛的一片土地。如果你在国内,可以敲入这个网址来访问Go语言的官网。

这个专栏专注于Go语言的核心知识,因此我并不会深入说明所有关于语法和命令的细枝末节。如果你想去全面了解Go语言的所有语法,那么可以去Go语言官网的语言规范页面仔细查阅。

当然了,这里的语言规范是全英文的,如果你想看汉化的内容也是有选择的,我记得先后有几拨国内的Go语言爱好者自发组织翻译过。不过我都没有仔细看过,不知道质量如何,所以在这里就不特别推荐了。

对于从事计算机和软件开发相关工作的同学,我强烈建议你们要有意地训练快速阅读英文文档的能力,不论是否借助字典和翻译工具。

不过,如果你想专门学习一下Go命令方面的知识和技巧,那么我推荐你看看我之前写的免费开源教程《Go命令教程》。这份教程的内容虽然稍显陈旧,但是帮助你学会使用Go语言自带的常用命令和工具肯定是没问题的。

好了,其实即使你是个编程小白也不用过于担心,我们会一起帮助你的。至于我刚刚说的Go语言规范和Go命令教程,你也可以在学习本专栏的过程中根据实际需要去有针对性的阅读。

3.这里有一份基础知识列表,请查收

如果你阅读本专栏的第一个模块时感觉有些吃力,那可能是你还没有熟悉Go语言的一些基础概念和知识。我为你精心制作了一张Go语言基础知识的导图,里面几乎包含了入门Go语言所需的所有知识点。


(长按保存大图)

有了这些,你是否已经感觉学习本专栏会更加轻松了呢?

总之,教程、资料和助推就交给我和极客时间的编辑、运营们来共同负责。而你需要做的,就是保存好这一份对Go语言学习的决心,你可以自己去尝试整理一份Go语言的学习笔记,遇见不懂的地方,你也可以在文章下面留言,我们一起讨论。

好了,感谢你的收听,我们下期再见。

戳此查看Go语言专栏文章配套详细代码。

精选留言

  • kanxiaojie

    2018-12-22 07:50:39

    这些年看了那么多教程,感觉极客这些课程真的是实在的干货😄
  • 会哭的鱼

    2020-04-21 22:44:25

    老师还是忍不住询问下,之前是PHP的工作,有好几年了,去年底开始接触GO感觉很喜欢,但是现在公司在转Java,因为Java也要耗费很多精力学习,但是又不想放弃Go,请问有什么好的方式呢?期待您的回答
    作者回复

    这个问题其实问得很好。相信很多技术人都有这样的困惑。咱们在这里先不说是否“为了Go语言而转团队甚至跳槽”的问题。

    我们先要从两个方面考虑。第一个,你需要问问自己,目前的公司和团队所做的事情是否是你热爱的?

    假设,如果你在金融领域中的一个很不错的互联网公司,那么这个公司必然是以Java为主的。你如果很喜欢在那里工作,那么就应该也以Java为主,把Go语言作为爱好。这其实并不冲突,研究Go语言可以让你深入了解到并发模型、操作系统和网络通讯方面的东西。这些技术到了底层其实都是想通的。Java由于中间有一层体量很庞大的JVM,所以有时反倒不容易看清底层的东西。当然了,如果你潜心研究JVM,那底层的东西也会涉及到一些。

    刚才说的是选择“做哪个领域的事”的问题,现在说选择“技术栈”的问题。一些互联网公司只用一种技术栈,这其实是懒惰的表现。每个技术栈都有它的特色和强势领域。一个优秀的互联网公司往往不会只使用一个技术栈,多个技术栈合力以充分发挥它们的最大优势才是王道。

    所以,第二个问题就是,你要问一问,你所在的公司是否对技术栈有包容性。如果有,那么很好,你可以建议先用Go语言做一些边缘的并且可以体现其优势的小项目,然后慢慢的再去扩大这种优势。如果万一没有,我也不能说这就是一家烂公司,也许它只是一家非技术驱动的公司。如果对于上面的第一个问题你的回答是否定的,那么就可以考虑动一动了。

    另外,我其实会鼓励软件程序员去构建自己的个人项目。这当然是在不耽误现有工作内容的前提下。通过这种方式,你也可以获得很多额外的实践机会和知识。这在你开始工作的前5年是很重要的。有时候,这种额外的实践也可以让你逐渐搞清楚自己真正热爱的是什么。为什么有的程序员2、3年就很牛了?这就是主要原因之一。不过,我在这里只是建议,因为这会以牺牲你的休息时间为代价。

    那总结来看,有三点:

    1. 你是否喜欢你所在的领域、公司和团队,热爱你现在做的事情?如果是,你就遵从团队的决定;如果不是,你可以结合第三个问题,做自己的项目或者更换职位。
    2. 你的公司是否对技术栈有足够的包容性,可以让你去探索和拓展?如果是,你要抓住机会,合力运用Go语言;如果不是,你需要结合第一个问题和第三个问题,做自己的项目或者更换职位。
    3. 你是否愿意牺牲个人的自由时间去做额外的实践?如果是,那么很好,赶紧去做吧!如果不是,那么你很可能需要顺从公司和团队的决定,因为这就是打工者应该做的。

    以上就是我想给你的答案。

    2020-04-22 14:46:54

  • 咖啡色的羊驼

    2018-08-20 00:28:16

    郝老师的学习路线图很棒,进阶之路有方向了。之前《The Go Programming Language》来学习go的,看了好几遍,《go并发编程》第二版今天昨天才开始看,确实查缺补漏了一些基础的点。
  • javaadu

    2018-08-20 10:33:54

    c++/c,python,java都学过,目前主力是java,也写一点c++。我学go语言的初衷是前公司使用了很多go开发的中间件(etcd、nsq等等),我希望能了解go语言在并发编程方面的特性,最好在必要的时候可以看懂这些中间件的源码
    作者回复

    你要是想深入了解Go并发编程可以买我写的那本《Go并发编程实战》第二版。

    2018-08-20 14:33:56

  • 天之草

    2018-08-20 23:14:50

    erlang转go,感觉差别不算大,channel和erlang的消息队列mailbox类似,区别比较大的是erlang每个虚拟进程都是独立的内存。而go的是共享内存,要操作和同步这些内存,最好用协程串行化,保证并发安全
  • 灬 黑 礼服 ~

    2018-11-29 11:30:02

    运维出身的学习下,就会shell。 希望有更多的收获!!!
  • 大毛哥

    2018-08-28 00:06:00

    仔细看了第二张图,到这里选这门课已经值了,非常棒
  • denglitong

    2018-08-27 09:21:32

    看完了《Go语言编程》,到新部门正好是用go语言开发,框架初步定了使用国内的beego框架,正需要进阶go,看到这个专栏毫不犹豫的买了,对goroutine并发不是很懂,下一步准备看《Go并发编程实战》
  • 随缘03230323

    2018-08-22 20:13:26

    会java,学go语言快吗?
    作者回复

    会很快,因为Go更简单。

    2018-08-23 22:22:06

  • 我来也

    2018-08-20 10:33:25

    在看这篇文章前,已经订阅了慕课网上的《go语言第一课》,也在看《go并发编程实战》第二版。
    题外话,与慕课网上的郝林头像相比,还是这里的帅,虽然那里也是真实的。
    作者回复

    谢谢啊!不是同一个时期的,这里的头像更贴近现在。

    2018-08-20 14:35:15

  • 学习高手song轻松

    2018-08-20 20:29:13

    很全面了,谢谢郝老师,我会努力的ヽ(•̀ω•́ )ゝ
  • Diviner.

    2018-08-20 10:21:23

    感谢老师的指点,在前进的路上不至于迷茫。
  • lik0914

    2018-08-20 08:49:02

    go错误机制,一直搞不太明白,工程实践的好方式呢
    作者回复

    在后面讲错误处理的时候我会深入解析。

    2018-08-20 14:35:53

  • galian

    2019-03-20 09:15:00

    我知道了。
    https://golang.google.cn/
  • 行者

    2018-08-26 08:50:29

    两张图收下了,真的很棒。第一张对即便是工作4年的我也有帮助,温故而知新。
  • 我来也

    2020-05-24 16:51:54

    看来老师最近恢复的不错.
    有时间出新书,还有时间大段的回复留言了.

    我最初,跟随者这个专栏入门了go语言,后来特意换了一份golang的工作.现在入职已经有一年多了.
    说实话,这个专栏对面试也非常有帮助.
    当初就是靠它,混过了面试那一关.

    因为我入职之前并没有golang的实战项目经验,仅仅是靠自学,根本就没法接触一些深层次的东西.
    但是看了老师的专栏,对一些概念,混了个脸熟,也会有一点了解.
    即使现在入职了一年多,但专栏中的很多知识点,在平常工作中也不常接触.
    所以最近专栏的结课测试中,也只能过个及格线一点.

    现在准备回过头来查漏补缺.
    今天在看`32 | context.Context类型`时,在源码中看到struct里面嵌入interface的用法.
    ```
    type Context interface {
    ...
    }
    type cancelCtx struct {
    Context
    ...
    }
    ```
    对这个知识点有点疑惑,顺便查了一下,感觉这一篇文章对我比较有帮助,在此也推荐给有需要的小伙伴.
    [golang的struct里面嵌入interface](https://www.jianshu.com/p/a5bc8add7c6e)

    -------------------------
    当初降薪跳槽,其实就是冲着柴老师(《Go语言高级编程》作者)去的.
    当初他就是面试官之一.😁
    比较可惜的是,等我一个月后办完离职手续,入职新公司时,柴老师已经离职了.
  • 王小宇丶

    2019-12-16 18:40:30

    请问下老师,思维导图在字面量->值字面量这个分支中,先说 ”整数字面量本身是无类型的“,但是赋值的时候又说”整数字面量的默认类型是int“ 请问这个改怎么理解呢?
    作者回复

    整数字面量,比如“123”、“456”,它们本身属于无类型的常量。数值字面量、字符字面量和字符串字面量本身都是无类型常量,都是不可变的。当它们被付给某个变量,或者被显式的类型转换之后就成为了有类型的值了。

    你可以把这看作是一个客观事物的两种不同状态。打个比方,你刚出生的时候,没有名字、没有国籍,但是你存在于社会中必须要有这两样东西。所以,在你被认可为一个独立且与其他人(比如你父母)有关联的人的时候,这两个外加的属性就会被赋予你。在这之后,你才能在社会中从事各种活动(否则就是黑户了)。

    一个整数字面量(或者说表示为整数的常量)在被真正使用之前,Go语言必然会为它设定一些属性。虽然对于每一种常量都存在与之对应的默认类型,但它们本身是无类型的。类型这个属性在常量被真正使用的时候才会生效且具有约束意义。

    更详细的说明可以参看官方文档:https://golang.google.cn/ref/spec#Constants 。

    2019-12-17 17:20:43

  • Dwyane

    2019-03-29 01:11:06

    老师你好,请问老师还可以看到留言吗?我是iOS的,有几点问题问老师。
    1.go的前景如何. 跟java比,老师是怎么看待的?
    2.mac电脑可以开发吗?我的是苹果电脑,如果不行,我只能装虚拟机或者双系统。
    作者回复

    你好,

    1. 这个问题要详细说的话可能要说很多。简单说,Go语言是一门很简约的编程语言,而Java体系复杂很多。如果你刚开始学一门后端编程语言,我建议学Go。另外这两门语言的适用领域是差不多的。但是由于Go语言更年轻,它本身更适应现代的编程需求。

    2. Go语言是跨平台的语言。从应用层面说,相同的程序可以在各种主流的操作系统上编译、安装和运行。所以macOS完全没有问题。

    2019-03-30 12:26:58

  • chon

    2018-12-17 10:41:45

    老师,有啥好用的go的开发工具ide推荐?谢谢
    作者回复

    vscode或者goland

    2018-12-23 22:45:51

  • 先听

    2018-12-06 21:35:58

    老师,go语言在接收db过来的null的时候会报错。请问针对这一点也没有什么推荐的比简洁舒服的实践方法呢?