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的作者都有谁:
- Ken Thompson Unix以及C的开发人员,1983年图灵奖得主
- Rob Pike Unix小组成员
- Robert Griesemer
- Russ Cox Google Code Search 项目负责人
- Ian Lance Taylor GCC社区活跃人物
- Brad Fitzpatrick Memcached 的作者
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语言,让你的程序飞起来。
参考资料:
Go学习入门的更多相关文章
- 每天成长一点---WEB前端学习入门笔记
WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...
- C# BackgroundWorker组件学习入门介绍
C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...
- 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV
这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...
- 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇
始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...
- UML学习入门就这一篇文章
1.1 UML基础知识扫盲 UML这三个字母的全称是Unified Modeling Language,直接翻译就是统一建模语言,简单地说就是一种有特殊用途的语言. 你可能会问:这明明是一种图形,为什 ...
- Stanford Parser学习入门(2)-命令行运行
在Stanford parser目录中已经定义了一部分命令行工具以及图形界面,本文将介绍如何在windows使用这些工具进行语法分析,Linux下也有shell可以使用. 关于如何搭建环境请参考上一篇 ...
- Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级
前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...
- 深度学习入门实战(二)-用TensorFlow训练线性回归
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者 :董超 上一篇文章我们介绍了 MxNet 的安装,但 MxNet 有个缺点,那就是文档不太全,用起来可能 ...
- Shell脚本编程学习入门 02
Shell脚本编程学习入门是本文要介绍的内容,我们可以使用任意一种文字编辑器,比如gedit.kedit.emacs.vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #! ...
- scrapy爬虫学习系列四:portia的学习入门
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
随机推荐
- log4j2 使用详解
转载自 Blog of 天外的星星: http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html Log4j 2的好处就不和大家说了,如果你搜了2,说明你 ...
- Laravel框架中的event事件操作
有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作中多 ...
- linux + docker + selenium grid 实现分布式执行selenium脚本
Selenium Grid 有两个概念 hub :主节点,你可以看作 "北京总公司的测试经理". node:分支节点,你可以看作 "北京总公司的测试小兵A" 和 ...
- Django2.0使用dos新建项目
由于本人的Pycharm不能直接生成Django项目,所以用命令行来生成项目,搭建此项目,请先搭建好环境 环境:PyCharm Python3.5.2 Django 2.0 1.使用dos进入工作目 ...
- python 全栈开发,Day48(标准文档流,块级元素和行内元素,浮动,margin的用法,文本属性和字体属性)
昨日内容回顾 高级选择器: 后代选择 : div p 子代选择器 : div>p 并集选择器: div,p 交集选择器: div.active 属性选择器: [属性~='属性值'] 伪类选择器 ...
- 《转》Web Service实践之——开始XFire
Web Service实践之——开始XFire 一.Axis与XFire的比较XFire是与Axis2 并列的新一代WebService平台.之所以并称为新一代,因为它:1.支持一系列Web Serv ...
- 《剑指offer》-链表的第一个公共节点
题目描述 输入两个链表,找出它们的第一个公共结点. 这题目是指针相关的题目.初步要判断出来,有公共节点的两个指针,应当是链表后半部分相同.这样的话,当遇到第一个相同节点(不是node的val相同,而是 ...
- [转] Java基础知识——Java语言基础
http://blog.csdn.net/loneswordman/article/details/9905931 http://blog.csdn.net/wanghuan203/article/d ...
- [转] Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程
一.HTTPS 是什么? 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合 ...
- Python swapcase
swapcase 字符串大写转换为小写小写转换为大写. a = "woHaoshuai" a.swapcase() WOhAOSHUAI