【语言学习】Go语言入门指导
1 GO语言介绍
Go是一种新的语言,一种并发的、带垃圾回收的、快速编译的语言。它具有以下特点:
它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。
Go为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头。
Go是静态类型的语言,它的类型系统没有层级。因此用户不需要在定义类型之间的关系上花费时间,这样感觉起来比典型的面向对象语言更轻量级。
Go完全是垃圾回收型的语言,并为并发执行与通信提供了基本的支持。按照其设计,Go打算为多核机器上系统软件的构造提供一种方法。
Go是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。
要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。
GO语言历史参考百度百科——很有必要了解下GO的由来,为什么要有GO语言。
2 学习方法
2.1 系统学习法
GO语言都有什么关键字? func, go,chan, for,switch,select,string,int, var等
GO语言基础类型有哪些? int float string等
GO语言代码编写风格? 类C语言风格(func), 类型定义反过来 var num int = 0等
GO语言代码构造? 包的概念package, 外部包引入import等
GO语言提供什么容器? 数组,slice,list,map, hash等
GO语言的独有特性? go协程routine, go的消息传递channel等
2.2 对比学习法
C/C++提供的容器在go语言里面分别对应什么(数组,向量,链表,哈希等)
C/C++提供的STL算法在go语言里面有对应的么
在go语言里面怎么定义变量,有多少种方式?
在go语言里面怎么写循环(for),怎么遍历一个容器?
在go语言里面怎么写判断语句,怎么写方法定义,怎么写对象定义?
Go语言怎么写客户端和服务端开发,用的什么?编码方式和unix socket有什么区别?
等等
3 学习资料
(1)中文论坛:http://www.golangtc.com/
(2)tour of go: http://tour.golangtc.com/welcome/
(3)go doc: http://godoc.golangtc.com/
(4)go学习: http://studygolang.com/
(5)go官网: https://golang.org/
(6)go 源项目: https://github.com/golang/go golang是开源的,你能看到go语言的实现源码。
(7)go 培训:(所有特性的例子代码) https://github.com/GoesToEleven/GolangTraining
值得全部例子都跑一边,对比学习的时候看源码,自己改改写写是最好的方式。
4 GO开发环境搭建
4.1 源码安装
源码/安装包下载目录:https://golang.org/dl/
Go1.4: go1.4.src.tar.gz
Go1.6: go1.6.src.tar.gz
注意,go编译器一开始用c语言编写1.4版本和以前版本(可以从开源库上可以看到), 1.4之后的版本使用go语言自身把编译器重写了一遍,所以1.4后面的版本编译的基础是本机已经有编译好的go1.4,linux默认/root/go1.4目录找go。如果没有安装go1.4,在编译之后的版本的时候会有报错找不到go1.4。
解压并编译到:
/root/go1.4
/root/go1.6
4.2 下载包含go编译器的可执行版本
源码/安装包下载目录: https://golang.org/dl/
Go1.x.x: go1.x.x.linux-amd64.tar.gz 64位的
解压到:
/root/go1.x
最新稳定版1.10
Go语言版本说明,如果对于版本有选择困难症的可以读一读这个,根据版本功能特性选择适合自己的版本。
4.3 环境变量配置
Go命令识别,需要配置Go 的编译器所在目录 GOROOT, 配置方法如下:
在/etc/profile 中添加:
export GOROOT=/root/go1.6
export PATH=GOROOT/bin
终端执行source /etc/profile 使环境变量生效。
4.4 Helloworld例子验证
4.4.1 指定GO工作环境, GOPATH
export GOPATH=/home/goexample
4.4.2 创建基本工作目录,并创建helloworld源码
4.4.3 编译运行
5 GO tools
go env 查看go相关的环境变量设置
go build 编译
5.3 go install 编译并安装到GOPATH的bin下
5.4 go test 单元测试
5.5 go run 直接运行
5.6 go get 依赖包安装
依赖包会安装到GOPATH/src/下
6 所有go特性例子代码
值得全部编译运行一遍
代码地址:https://github.com/GoesToEleven/GolangTraining
7 GO语言关键知识点
Go channel
Go routine
Go package
Go import
Go net/tcp
Go 编写服务端采用的服务模型,跟epoll,select,以及libevent什么区别。
8 Go实战进阶
8.1 Google protobuf
——go protobuf 协议打包和解包,自定义协议,远程服务,高并发服务
8.2 Facebook thrift
——go thrift RPC调用,分布式服务
8.3 Go Web
——web开发框架 Go web:
8.4 Go API Server
——Restful http/https标准,API server标准接口
8.5 GO语言开源框架汇总
https://github.com/avelino/awesome-go
9 可能会碰到的问题
9.1 问题1——网站无法访问
Go相关的官网和技术网站无法访问?
因为你的确是需要一个VPN,请私聊。或者自己想办法。
9.2 问题2——划重点
按照指导的还一头雾水,不知道怎么入手!
ok,给你划重点:
1)对比学习法(这个适用于已经有其他语言基础和一定时间开发项目经验的人),没有语言基础的(毕业生)请选择系统学习法。
2)Go相关的网址推荐全部加入到你的浏览器收藏夹(我的浏览器有100个目录,你觉得你是不是需要跟下风)
3)环境搭建好之后,把go的所有命令行工具的例子都跑一遍(这个可以结合第4)点做。
4)结合6章节的例子进行学习(默认你应该每个例子都go build 和运行一下)。
9.3 问题3——Go实战进阶
ok,对的,它不一定适合你,但是在现在基于docker,k8s,以及微服务的开发模式下,你还是要对RestAPI, rpc等技术的熟悉,对http/https协议的精通,并能应用到项目中。
这个可选吧:基于proto buf的socket编程(或许有一天没人知道socket编程是啥了吧)
另外Go访问数据库(如Mysql)有类似ORM的机制是个很不错的设计模式。
第一篇文章就写着么多吧,下一篇会考虑写一下关于现在使用Golang涉及到的一些框架和应用;
欢迎随时联系我交流编程技术;
欢迎加入华哥Dean的“Go编程”知识星球。
我正在「Go编程」和朋友们讨论有趣的话题,你一起来吧?