快速开始一个Go程序
目标:
- 学习如何写一个复杂的Go程序
- 生命类型、变量、函数和方法
- 启动并同步操作goroutine
- 使用接口写通用的代码
- 处理程序逻辑和错误
演示代码地址:
Go语言的优势
1. 开发速度
Go语言使用了更加智能的编译器,并简化了解决依赖的算法,最终提供了更快的编译速度。编译Go程序时,编译器只会关注那些直接被引用的库,而不是像java、C和C++那样,要办理依赖链中所有依赖的库。
2. 并发
Go语言对并发的支持是这门语言最重要的特性之一。goroutine很像线程,但是它占用的内存远小于线程,使用它需要的代码更少。通道(channel)是一种内置的数据结构,可以让用户在不同的goroutine之间同步发送具有类型的信息。这让编程模型更倾向于在goroutine之间发送消息,而不是让多个goroutine争夺同一个数据的使用权。
goroutine
goroutine是可以与其他goroutine并行执行的函数,同时也会与主程序(程序的入口)并行执行。在其他编程语言中,需要用线程来完成同样的事情,而在Go语言中会使用同一个线程来执行多个goroutine.
goroutine使用的内存比线程更少,Go语言运行时会自动在配置的一组逻辑处理器上调度执行goroutine。每个逻辑处理器绑定到一个操作系统线程上,这让用户的应用程序执行效率更高,而开发工作量显著减少。
channel
channel是一种数据结构,可以让goroutine之间进行安全的数据通信。通道可以帮用户避免其他语言里常见的共享内存访问的问题。
通道这一数据模式保证同一时刻只会有一个goroutine修改数据。
需要强调的是,通道并不提供跨goroutine的数据访问保护机制。如果通过通道传输数据的一份副本,那么每个goroutine都持有一份副本,各自对自己的副本做修改是安全的。当传输的是指向数据的指针时,如果读和写是由不同的goroutine完成的,每个goroutine依旧需要额外的同步动作。
Go语言的类型系统
Go语言提供了灵活的、无继承的类型系统,无需降低运行性能就能最大程度上复用代码。Go开发者使用组合(composition)设计模式,只需要简单地将一个类型嵌入到另一个类型,就能复用所有的功能。
在Go语言中,一个类型是由其他更微小的类型组合而成,避免了传统的基于继承的模型。
另外,Go语言还具有独特的接口实现机制,允许用户对行为进行建模,而不是对类型进行建模。在Go语言中不需要声明某个类型实现了某个接口,编译器会判断一个类型的实例是否符合正在使用的接口。
类型简单
Go语言不仅有类似int和string这样的内置类型,还支持用户定义的类型。在Go语言中,用户定义的类型通常包含一组带类型的字段,用于存储数据。Go语言的用户定义的类型和C语言的结构很像,用起来也相似。但是Go语言的类型可以声明操作该类型数据的方法。
Go接口对一组行为建模
接口用于描述类型的行为。如果一个类型的实例实现了一个接口,意味着这个实例可以执行一组特定的行为。在Go语言中,如果一个类型实现了一个接口的所有方法,那么这个类型的实例就可以存储在这个接口类型的实例中,不需要额外声明。
在Go语言中,最常使用的接口之一是io.Reader。这个接口提供了一个简单的方法,用来声明一个类型有数据可以读取。Go语言的接口更小,只倾向于定义一个单一的动作。Go语言的整个网络库都使用了io.Reader接口,这样可以将程序的功能和不同网络的实现分离。文件、缓冲区、套接字以及其他的数据源都实现了io.Reader接口。
内存管理
Go语言拥有现代化的垃圾回收机制。把无趣的内存管理交给专业的编译器去做,让程序员专注于更有趣的事情。
Go语言开发环境配置
下载
Go官网下载地址:https://golang.org/dl/
Go官方镜像站(推荐):https://golang.google.cn/dl/
版本的选择
Windows平台和Mac平台推荐下载可执行文件版,Linux平台下载压缩文件版。
安装![安装结束](https://img-blog.csdnimg.cn/20200304232225402.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FSUE9TUEY=,size_16,color_FFFFFF,t_70)
检查
上一步安装过程执行完毕后,可以打开终端窗口,输入go version命令,查看安装的Go版本。
环境变量配置
配置GOPATH
GOPATH是一个环境变量,用来表明你写的go项目的存放路径(工作目录)。
GOPATH路径最好只设置一个,所有的项目代码都放到GOPATH的src目录下。
补充说明:Go1.11版本之后,开启go mod模式之后就不再强制需要配置GOPATH了。
Linux和Mac平台就参照上面配置环境变量的方式将自己的工作目录添加到环境变量中即可。
在 Go 1.8 版本之前,GOPATH环境变量默认是空的。从 Go 1.8 版本开始,Go 开发包在安装完成后会为 GOPATH设置一个默认目录,参见下表。
GOPATH在不同操作系统平台上的默认值
平台 | GOPATH默认值 | 举例 |
---|---|---|
Windows | %USERPROFILE%/go | C:\Users\用户名\go |
Unix | $HOME/go | /home/用户名/go |
同时,我们将GOROOT下的bin目录及GOPATH下的bin目录都添加到环境变量中。
配置环境变量之后需要重启你电脑上已经打开的终端。(例如cmd、VS Code里面的终端和其他编辑器的终端)。
Go项目结构
在进行Go语言开发的时候,我们的代码总是会保存在 GOPATH/src目录下, 产生的二进制可执行文件放在 $GOPATH/bin目录下,生成的中间缓存文件会被保存在 GOPATH/src目录的源代码即可。bin 和 pkg 目录的内容无需版本控制。
适合个人开发者
我们知道源代码都是存放在GOPATH的src目录下,那我们可以按照下图来组织我们的代码。
目前流行的项目结构
Go语言中也是通过包来组织代码文件,我们可以引用别人的包也可以发布自己的包,但是为了防止不同包的项目名冲突,我们通常使用顶级域名来作为包名的前缀,这样就不担心项目名冲突的问题了。
因为不是每个个人开发者都拥有自己的顶级域名,所以目前流行的方式是使用个人的github用户名来区分不同的包。
从github上下载别人包的时候,如:
go get github.com/jmoiron/sqlx
那么,这个包会下载到我们本地GOPATH目录下的src/github.com/jmoiron/sqlx。
适合企业开发场景
Go语言开发工具
Go采用的是UTF-8编码的文本文件存放源代码,理论上使用任何一款文本编辑器都可以做Go语言开发,这里推荐使用VS Code和Goland。 VS Code是微软开源的编辑器,而Goland是jetbrains出品的付费IDE。
我们这里使用VS Code 加插件做为go语言的开发工具。
VS Code介绍
VS Code全称Visual Studio Code,是微软公司开源的一款免费现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,支持插件扩展,支持 Win、Mac 以及 Linux平台。
虽然不如某些IDE功能强大,但是它添加Go扩展插件后已经足够胜任我们日常的Go开发。
下载与安装
VS Code官方下载地址:https://code.visualstudio.com/Download
三大主流平台都支持,请根据自己的电脑平台选择对应的安装包。
安装Go语言插件
第一个Go语言程序
package main // 声明 main 包,表明当前是一个可执行程序
import "fmt" // 导入内置 fmt 包
func main(){ // main函数,是程序执行的入口
fmt.Println("Hello World!") // 在终端打印 Hello World!
}
运行结果:
参考资料
- https://www.cnblogs.com/Xuuuuuu/p/12368771.html
- https://www.cnblogs.com/nickchen121/p/11517473.html
- https://cloud.tencent.com/developer/article/1422697