Go学习入门

1. 为什么要学习Go

Go语言宣称为互联网时代的C语言,那她有那些特性值得我们必须学习呢:

  • 并行与分布式支持。除了我们日常熟悉的进程和线程,Go语言中提供了协程coroutine,从而简化了并行开发的难度。
  • 软件工程支持。这体现在很多方面,我觉得Go语言借鉴了Python的做法,通过代码风格规范进行强制统一,从而减少工程管理的难度。
  • 编程思想的变化。过去面向过程和面向对象是两大编程流派,Go语言则使用批判吸收的方法,融合众家之长,以更实用的目标作为语言发展的基调。

2. Go语言简史

Go语言的历史要从贝尔实验室开始说起,我们知道贝尔实验室计算科学研究中心的肯•汤普逊 Ken Thompson 和丹尼斯 • 里奇 Dennis Ritchie开发了Unix系统以及开发系统所使用的C语言。在这之后他们还开发了Plan 9操作系统。

后来包括Ken Tompson在内的Plan 9 原班人马加入Google,在Google他们创立了Go语言。2007年9月之前Go语言是20%自由时间的实验项目,到了2008年5月Google发现Go语言的巨大潜力,开始全力支持这个项目。Go语言的第一个版本是2009年11月正式对外发布。

Go语言采用BSD授权协议,任何人都可以查看Go语言的所有源代码。

Go语言之所以发展迅猛引人注目,还有一个重要原因是其拥有一个豪华的作者团队。我们来看一下GO的作者都有谁:

3. 语言特性

  • 自动内存回收。手工管理内存让人十分崩溃,很容易造成内存泄漏问题,目前内存泄漏问题最佳的解决方案就是在语言级别提供GC(Garbage Collection)
  • 更丰富的内置类型。Go语言中新增了一些近年来流行语言中提供的一些高级类型,例如map、slice
  • 函数多返回值,这个功能是我接触了Python之后才知道的,之前的语言为了返回多个值,通常会创建一个数组或者结构体,现在再也不用发愁了,Go语言率先在静态语言中提供了函数多返回值功能
  • 错误处理。引入了三个关键字用于标准的错误处理流程,defer、panic、recover,避免了try catch的使用,减少了代码量
  • 匿名函数和闭包,这个特性好像也是动态语言率先使用的
  • 类型和接口。类型定义类似于C语言中的结构(struct),引入了“非侵入式”接口概念
  • 并发编程。使用goroutine而不是操作系统的并发机制,使用消息传递而不是使用共享内存来通信,让并发编程变得更加轻盈和安全
  • 反射 Reflection,Go实现了反射的大部分功能,但没有像Java语言那样内置类型工厂
  • 语言交互性。可以在Go语言中使用Cgo的特定语法混合编写C语言代码

4. Hello World

package main

/**
 * My First Go Program!
 **/
 import "fmt"
 
 func main() {
     fmt.Println("Hello, world!")
 }

其中的一些语法规范

  • package 表明代码所属的包,包是Go语言最基本的分发单位,要生成可执行的Go程序,必须有一个main包以及一个main函数
  • main 函数,不能带参数,也不能有返回值
  • import 用于引入程序依赖的包,注意不能包含在程序中没有用到的包,这一点可以看出Go是极力追求精简的
  • 代码注释与C语言一样,支持两种注释方式,单行注释和多行注释
  • 花括号不能在行的开头,否则编译会报错

Python 和 Go 给我印象最深刻的一点是形式即代码,例如原来在PHP中,每段代码的结尾都必须有;来表示,而在Python和Go中,通过严格的形式规定,可以减少不必要代码的录入,同时又能够保证参与工程开发的所有人都遵循这个形式。 特别是对于大型的工程,不再通过一些配置文件来指定目录层次或者引用关系,而完全依靠实际的目录层级来推导工程的结构。这样就保证了工程规范能够强制性的被所有人执行,大大提高了协作的效率。

5. 编译环境与开发工具

Go语言提供了Windows、Linux、Mac OS三种安装包,因为众所周知的原因,我们没有办法从官网下载,但是大家还是可以从中文站点下载

bogon:~ rousseau$ go version
go version go1.11 darwin/amd64

上面的命令执行后如果能够正常输出表示编译环境已经安装好了,可以将hello world程序编译了。将上面的代码保存为hello.go,然后执行。

bogon:go.my rousseau$ go run hello.go
Hello, world!

go run命令将编译、链接、 运行三个步骤合为一步,运行后不会再当前目录看到任何中间文件和可执行文件。使用go build命令会生成可执行文件。

bogon:go.my rousseau$ go build hello.go 
bogon:go.my rousseau$ ls
hello       hello.go
bogon:go.my rousseau$ ./hello 
Hello, world!

关于开发工具的选择,这个第一要看个人习惯,第二要结合项目的规模和最多使用的一些功能。可以用来编程的工具包括 vim、VS Code、liteIDE、goland等,目前我水平还比较菜,感觉Vim或者VS Code就能满足需求了。

6. Go的工程管理

Go消除了工程文件的概念,完全用目录结构和包名来推导工程结构和构建顺序。 看一个简单的命令行计算器工程的目录结构,代码在这里

想要编译这个工程,执行以下命令。

bogon:calcproject rousseau$ export GOPATH=$(pwd)
bogon:calcproject rousseau$ cd bin
bogon:bin rousseau$ go build calc
bogon:bin rousseau$ ./calc 
Usage: calc command [arguments] ... 

The commands are:
    add Addition of two values.
    sqrt    Square root of a non-negative value.

7. 问题追踪和调试

7.1 打印日志

Go语言中包含了一个fmt包,包含了大量的打印函数,主要用到的是Printf()Println()两个函数。区别就是一个能够换行一个不能换行。

7.2 GDB 调试

Go语言编译的二进制程序直接支持GDB调试,具体的细节后续会详细介绍。

8. 交流讨论

需要交流讨论的朋友,欢迎加我的公众号,一起来学习Go语言,让你的程序飞起来。

参考资料:

  1. 打不开的 Golang 官网
  2. Golang中文网
  3. LiteIDE
  4. Goland
  5. GDB调试Go程序

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏wOw的Android小站

[Objective-C] Block实现回调和简单的学习思考

关于Objective-C的回调,最常见的应该是用delegate代理实现。不过代理的实现比起Block要更基础,就不介绍了,下面总结一下Block回调的实现。

12420
来自专栏雪胖纸的玩蛇日常

第一章 介绍与循环

17930
来自专栏腾讯大讲堂的专栏

设计模式笔记

| 导语 “计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决” “Any problem in computer science can be so...

51680
来自专栏杨建荣的学习笔记

初识YAML

晚上本来想看看Julia语言的,最后发现需要花额外的不少时间,就先放放,那就看看Yaml吧,要学习的话,周期短,本身也比较简单清晰。 早些年的...

29170
来自专栏Java帮帮-微信公众号-技术文章全总结

第一天 Java基础入门【悟空教程】

47770
来自专栏CSDN技术头条

Go语言实践:从新手入门到上线真实的小型服务所遇到的那些坑

Teamwork团队在去年写了近20万行Go代码,建造了一堆速度奇快的小型HTTP服务,本文列出了他们总结的9条经验教训。 为什么选择Go语言?Go语言,又称G...

23670
来自专栏Golang语言社区

Go语言实战: 编写可维护Go语言代码建议

大家好, 我在接下来的两个会议中的目标是向大家提供有关编写Go代码最佳实践的建议。

24930
来自专栏Golang语言社区

Go语言实践:从新手入门到上线真实的小型服务所遇到的那些坑

摘要: Teamwork团队在去年写了近20万行Go代码,建造了一堆速度奇快的小型HTTP服务,本文列出了他们总结的9条经验教训。 为什么选择Go语言?Go...

39660
来自专栏cnblogs

webpack + vue 在dev和production模式下的小小区别

19520
来自专栏Java帮帮-微信公众号-技术文章全总结

从零开始学Java-SpringMVC统一异常处理

看到 Exception 这个单词都心慌 如果有一天你发现好久没有看到Exception这个单词了,那你会不会想念她?我是不会的。她如女孩一样的令人心动又心慌...

35240

扫码关注云+社区

领取腾讯云代金券