第1篇:Go语言入门及环境搭建

一、Go语言介绍

1. Go语言诞生背景

最近十年来,C/C++在计算领域没有很好得到发展,并没有新的系统编程语言出现。对开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译,如C++;要么执行低效,但拥有有效的编译,如.NET、Java;所以需要一种拥有较高效的执行速度、编译速度和开发速度的编程语言,Go就横空出世了。

传统的语言比如c++,大家花费太多时间来学习如何使用这门语言,而不是如何更好的表达写作者的思想,同时编译花费的时间实在太长,对于编写-编译-运行这个链条来说周期太长。动态语言如Python,由于没有强类型的约束,很多问题需要在运行时发现,这种低级错误更应该交给编译器来发现。

  • 人力成本越来越高
  • 机器越来越便宜
  • 机器的性能越来越厉害
  • 在开发效率和运行速度上达到平衡

go出现之前,无论汇编语言、还是动态脚本语言,在执行效率和开发效率上都不能兼备。

执行效率 execution speed: C/C++ > Java > PHP 开发效率 developing efficiency: PHP > Java > C/C++

谷歌的“20%时间”工作方式,允许工程师拿出20%的时间来研究自己喜欢的项目。语音服务Google Now、谷歌新闻Google News、谷歌地图Google Map上的交通信息等,全都是20%时间的产物。Go语言最开始也是20%时间的产物。

Go三个创始人

Go的三个作者分别是: Rob Pike(罗伯.派克),Ken Thompson(肯.汤普森)和Robert Griesemer(罗伯特.格利茨默) 。

  • Rob Pike:曾是贝尔实验室(Bell Labs)的Unix团队,和Plan 9操作系统计划的成员。他与Thompson共事多年,并共创出广泛使用的UTF-8 字元编码。
  • Ken Thompson:主要是B语言、C语言的作者、Unix之父。1983年图灵奖(Turing Award)和1998年美国国家技术奖(National Medal of Technology)得主。他与Dennis Ritchie是Unix的原创者。Thompson也发明了后来衍生出C语言的B程序语言。
  • Robert Griesemer:在开发Go之前是Google V8ChubbyHotSpot JVM的主要贡献者。
  • 此外还有Plan 9开发者Russ Cox、和曾改善目前广泛使用之开原码编译器GCC的Ian Taylor

2. Go语言的缔造与发展

2.1 Go语言的命名

这是一封由 Rob Pike 在 2007 年 9 月 25 号,星期二,下午 3:12 回复给 Robert Griesemer、Ken Thompson 的有关编程语言讨论主题的邮件,邮件正文大意为:

在开车回家的路上我得到了些灵感。1.给这门编程语言取名为“go”,它很简短,易书写。工具类可以命名为:goc、 gol、goa。交互式的调试工具也可以直接命名为“go”。语言文件后缀名为 .go 等等。

​ 这就是 Go 语言名字的来源,自此之后 Robert、Rob 和 Ken 三个人开始在 Google 内部进行了研发,一直到了 2009 年,Go 正式开源了,Go 项目团队将 2009 年 11 月 10 日,即该语言正式对外开源的日字作为其官方生日。源代码最初托管在 http://code.google.com 上,之后几年才逐步的迁移到 GitHub 上。

2.2 Go发展过程中的记事

第一个事情是在开发设计 Go 语言过程中的第一个重大惊喜是收到了以下这封邮件:

img

这是一封由 Ian Lance Taylor 在 2008 年 6月 7 日(星期六)的晚上 7:06 写给 Robert Griesemer、Rob Pike、 Ken Thompson 的关于 Go gcc 编译器前端的邮件。邮件正文大意如下:

我的同事向我推荐了这个网站 http://…/go_lang.html 。这似乎是一门很有趣的编程语言。我为它写了一个 gcc 编译器前端。虽然这个工具仍缺少很多的功能,但它确实可以编译网站上展示的那个素数筛选程序了。

Ian Lance Taylor 的加入以及第二个编译器 (gcc go) 的实现 在带来震惊的同时,也伴随着喜悦。这对 Go 项目来说不仅仅是鼓励,更是一种对可行性的证明。语言的第二次实现对制定语言规范和确定标准库的过程至关重要,同时也有助于保证其高可移植性,这也是 Go 语言承诺的一部分。自此之后 Ian Lance Taylor 成为了设计和实现 Go 语言及其工具的核心人物。

第二件事情是 Russ Cox 在2008年带着他的语言设计天赋和编程技巧加入了刚成立不久的 Go 团队。Russ 发现 Go 方法的通用性意味着函数也能拥有自己的方法,这直接促成了 http.HandlerFunc 的实现,这是一个让 Go 一下子变得无限可能的特性。Russ 还提出了更多的泛化性的想法,比如 io.Reader 和 io.Writer 接口,奠定了所有 I/O 库的整体结构。

第三件事情是聘请了安全专家 Adam Langley 帮助 Go 走向 Google 外面的世界。Adam 为 Go 团队做了许多不为外人知晓的工作,包括创建最初的 http://golang.org 网站以及 build dashboard。不过他最大的贡献当属创建了 cryptographic 库。起先,在我们中的部分人看来,这个库无论在规模还是复杂度上都不成气候。但是就是这个库在后期成为了很多重要的网络和安全软件的基础,并且成为了 Go 语言开发历史的关键组成部分。许多网络基础设施公司,比如 Cloudflare,均重度依赖 Adam 在 Go 项目上的工作,互联网也因它变得更好。我记得当初 beego 设计的时候,session 模块设计的时候也得到了 Adam 的很多建议,因此,就 Go 而言,我们由衷地感谢 Adam。

第四个事情就是一家叫做 Docker 的公司。就是使用 Go 进行项目开发,并促进了计算机领域的容器行业,进而出现了像 Kubernetes 这样的项目。现在,我们完全可以说 Go 是容器语言,这是另一个完全出乎意料的结果。

img 除了大名鼎鼎的Docker,完全用GO实现。业界最为火爆的容器编排管理系统kubernetes完全用GO实现。之后的Docker Swarm,完全用GO实现。除此之外,还有各种有名的项目,如etcd/consul/flannel,七牛云存储等等 均使用GO实现。有人说,GO语言之所以出名,是赶上了云时代。但为什么不能换种说法?也是GO语言促使了云的发展。

除了云项目外,还有像今日头条、UBER这样的公司,他们也使用GO语言对自己的业务进行了彻底的重构。

2.3 总结

Go语言是谷歌2009年发布的第二款开源编程语言(系统开发语言),它是基于编译、垃圾收集和并发的编程语言。 Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美 C / C++代码的速度,而且更加安全、支持并行进程。作为出现在21世纪的语言,其近C的执行性能和近解析型语言的开发效率,以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发。不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。 很多人将Go语言称为21世纪的C语言,因为Go不仅拥有C的简洁和性能。而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性。被称为Go语言之父的罗勃·派克(Rob Pike)就曾说过,你是否同意Go语言,取决于你是认可少就是多,还是少就是少(Less is more or less is less)。Go语言的整个设计哲学就是:将简单、实用体现得淋漓尽致。 如今 Go 已经是云计算编程语言,GO语言背靠Google这棵大树,又不乏牛人坐镇,是名副其实的“牛二代”。想象一下:一个只有十几年发展经历的编程语言,已经成为了如此巨大而且正在不断发展的行业的主导者,这种成功是每个人都无法想象的。

3. 为什么选择Go?

3.1 Go为并发而生

go语言(或 Golang)是Google开发的开源编程语言,诞生于2006年1月2日下午15点4分5秒,于2009年11月开源,2012年发布go稳定版。Go语言在多核并发上拥有原生的设计优势,Go语言从底层原生支持并发,无须第三方库、开发者的编程技巧和开发经验。

go是非常年轻的一门语言,它的主要目标是“兼具Python 等动态语言的开发速度和C/C++等编译型语言的性能与安全性”

很多公司,特别是中国的互联网公司,即将或者已经完成了使用 Go 语言改造旧系统的过程。经过 Go 语言重构的系统能使用更少的硬件资源获得更高的并发和I/O吞吐表现。充分挖掘硬件设备的潜力也满足当前精细化运营的市场大环境。

Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程。可以将 goroutine 理解为一种虚拟线程。Go 语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用CPU性能。开启一个goroutine的消耗非常小(大约2KB的内存),你可以轻松创建数百万个goroutine

goroutine的特点:

1. goroutine具有可增长的分段堆栈。这意味着它们只在需要时才会使用更多内存。
2. goroutine的启动时间比线程快。
3. goroutine原生支持利用channel安全地进行通信。
4. goroutine共享数据结构时无需使用互斥锁。
3.2 Go语言的发展目标

Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得更加有乐趣,而不是在艰难抉择中痛苦前行。因此,Go 语言是一门类型安全和内存安全的编程语言。虽然 Go 语言中仍有指针的存在,但并不允许进行指针运算。

Go 语言的另一个目标是对于网络通信、并发和并行编程的极佳支持,从而更好地利用大量的分布式和多核的计算机,这一点对于谷歌内部的使用来说就非常重要了。设计者通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 channel 来实现各个 goroutine 之间的通信。他们实现了分段栈增长和 goroutine 在线程基础上多路复用技术的自动化。

这个特性显然是 Go 语言最强有力的部分,不仅支持了日益重要的多核与多处理器计算机,也弥补了现存编程语言在这方面所存在的不足。

Go 语言中另一个非常重要的特性就是它的构建速度(编译和链接到机器代码的速度),一般情况下构建一个程序的时间只需要数百毫秒到几秒。作为大量使用 C++ 来构建基础设施的谷歌来说,无疑从根本上摆脱了 C++ 在构建速度上非常不理想的噩梦。这不仅极大地提升了开发者的生产力,同时也使得软件开发过程中的代码测试环节更加紧凑,而不必浪费大量的时间在等待程序的构建上。

依赖管理是现今软件开发的一个重要组成部分,但是 C 语言中“头文件”的概念却导致越来越多因为依赖关系而使得构建一个大型的项目需要长达几个小时的时间。人们越来越需要一门具有严格的、简洁的依赖关系分析系统从而能够快速编译的编程语言。这正是 Go 语言采用包模型的根本原因,这个模型通过严格的依赖关系检查机制来加快程序构建的速度,提供了非常好的可量测性。

整个 Go 语言标准库的编译时间一般都在 20 秒以内,其它的常规项目也只需要半秒钟的时间来完成编译工作。这种闪电般的编译速度甚至比编译 C 语言或者 Fortran 更加快,使得编译这一环节不再成为在软件开发中困扰开发人员的问题。在这之前,动态语言将快速编译作为自身的一大亮点,像 C++ 那样的静态语言一般都有非常漫长的编译和链接工作。而同样作为静态语言的 Go 语言,通过自身优良的构建机制,成功地去除了这个弊端,使得程序的构建过程变得微不足道,拥有了像脚本语言和动态语言那样的高效开发的能力。

另外,Go 语言在执行速度方面也可以与 C/C++ 相提并论。

由于内存问题(通常称为内存泄漏)长期以来一直伴随着 C++ 的开发者们,Go 语言的设计者们认为内存管理不应该是开发人员所需要考虑的问题。因此尽管 Go 语言像其它静态语言一样执行本地代码,但它依旧运行在某种意义上的虚拟机,以此来实现高效快速的垃圾回收(使用了一个简单的标记-清除算法)。

尽管垃圾回收并不容易实现,但考虑这将是未来并发应用程序发展的一个重要组成部分,Go 语言的设计者们还是完成了这项艰难的任务。

Go 语言还能够在运行时进行反射相关的操作。

使用 go install 能够很轻松地对第三方包进行部署。

3.3 Go语言的指导设计原则

Go语言通过减少关键字的数量(25 个)来简化编码过程中的混乱和复杂度。干净、整齐和简洁的语法也能够提高程序的编译速度,因为这些关键字在编译过程中少到甚至不需要符号表来协助解析。这些方面的工作都是为了减少编码的工作量,甚至可以与 Java 的简化程度相比较。

Go 语言有一种极简抽象艺术家的感觉,因为它只提供了一到两种方法来解决某个问题,这使得开发者们的代码都非常容易阅读和理解。众所周知,代码的可读性是软件工程里最重要的一部分( 代码是写给人看的,不是写给机器看的 )。

这些设计理念没有建立其它概念之上,所以并不会因为牵扯到一些概念而将某个概念复杂化,他们之间是相互独立的。

Go 语言有一套完整的编码规范,你可以在 Go 语言编码规范 页面进行查看。

LALR 是 Go 语言的语法标准,这种语法标准在编译时不需要符号表来协助解析。

3.4 Go语言的特性

Go 语言从本质上(程序和结构方面)来实现并发编程。

因为 Go 语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go 语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说这是一门混合型的语言。

在传统的面向对象语言中,使用面向对象编程技术显得非常臃肿,它们总是通过复杂的模式来构建庞大的类型层级,这违背了编程语言应该提升生产力的宗旨。

函数是 Go 语言中的基本构件,它们的使用方法非常灵活。在第六章,我们会看到 Go 语言在函数式编程方面的基本概念。

Go 语言使用静态类型,所以它是类型安全的一门语言,加上通过构建到本地代码,程序的执行速度也非常快。

作为强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有的东西都是显式的。

Go 语言其实也有一些动态语言的特性(通过关键字 var),所以它对那些逃离 Java 和 .Net 世界而使用 Python、Ruby、PHP 和 JavaScript 的开发者们也具有很大的吸引力。

Go 语言支持交叉编译,比如说你可以在运行 Linux 系统的计算机上开发运行 Windows 下运行的应用程序。这是第一门完全支持 UTF-8 的编程语言,这不仅体现在它可以处理使用 UTF-8 编码的字符串,就连它的源码文件格式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化!

3.5 Go语言简单易学
  • 语法简洁

Go 语言简单易学,学习曲线平缓,不需要像 C/C++ 语言动辄需要两到三年的学习期。Go 语言被称为“互联网时代的C语言”。Go 语言的风格类似于C语言。其语法在C语言的基础上进行了大幅的简化,去掉了不需要的表达式括号,循环也只有 for 一种表示方法,就可以实现数值、键值等各种遍历。

  • 代码风格统一

Go 语言提供了一套格式化工具——go fmt。一些 Go 语言的开发环境或者编辑器在保存时,都会使用格式化工具进行修改代码的格式化,这样就保证了不同开发者提交的代码都是统一的格式。(吐槽下:再也不用担心那些看不懂的黑魔法了…)

  • 开发效率高

开发效率高图

Go语言实现了开发效率与执行效率的完美结合,让你像写Python代码(效率)一样编写C代码(性能)。

3.6 使用go的公司

4. Go适合做什么

  • 服务端开发
  • 分布式系统,微服务
  • 网络编程
  • 区块链开发
  • 内存KV数据库,例如boltDBlevelDB
  • 云平台

5. 学习Go语言的前景

目前Go语言已经⼴泛应用于人工智能、云计算开发、容器虚拟化、⼤数据开发、数据分析及科学计算、运维开发、爬虫开发、游戏开发等领域。

Go语言简单易学,天生支持并发,完美契合当下高并发的互联网生态。Go语言的岗位需求持续高涨,目前的Go程序员数量少,待遇好。

抓住趋势,要学会做一个领跑者而不是跟随者。

国内Go语言的需求潜力巨大,目前无论是国内大厂还是新兴互联网公司基本上都会有Go语言的岗位需求。

二、Go语言环境搭建

Go 和 C语言、C++、Python、Java 等一样都是编程语言。学习任何一门编程语言本质上都分3步走:

  • 第一步:安装 解释器 或 编译器
  • 第二步:学相关编程语言语法,然后写代码。
  • 第三步:用已安装解释器 或 编译器 去运行自己写的代码,这样代码就会去完成我们编写的功能了。

Go是编译型语言,所以我们一般称Go安装是编译器

Go是开源且跨平台的一门编程语言,所以他支持window、linux、mac操作系统,同时也意味着我们可以在各种系统中安装Go的编译器。

1. 环境变量

Go 开发环境依赖于一些操作系统环境变量,你最好在安装 Go 之前就已经设置好他们。如果你使用的是 Windows 的话,你完全不用进行手动设置,Go 将被默认安装在目录 c:/go 下。这里列举几个最为重要的环境变量:

  • GOROOT 表示 Go 在你的电脑上的安装位置,它的值一般都是 $HOME/go,当然,你也可以安装在别的地方。

  • GOPATH 用于存放Go项目源码文件、包文件和编译后的可执行文件的路径,而这些路径下又必须分别包含三个规定的目录:srcpkgbin,这三个目录分别用于存放源码文件、包文件和可执行文件(go 1.11版本后,go mod)。默认采用和 $GOROOT 一样的值,但从 Go 1.1 版本开始,你必须修改为其它路径。。

  • GOBIN 表示编译后可执行文件的存放位置,默认是 $GOROOT/bin

  • GORROXY GO下载包的国内代理,常用的国内代理

    阿里云    https://mirrors.aliyun.com/goproxy/
    七牛云    https://goproxy.cn
    goproxy.io  https://goproxy.io/
  • $GOMAXPROCS 用于设置应用程序可使用的处理器个数与核数。

  • GOARCH 表示目标机器的处理器架构,它的值可以是 386、amd64 或 arm。

  • GOOS 表示目标机器的操作系统,它的值可以是 darwinfreebsdlinuxwindows

目标机器是指你打算运行你的 Go 应用程序的机器。

Go 编译器支持交叉编译,也就是说你可以在一台机器上构建运行在具有不同操作系统和处理器架构上运行的应用程序,也就是说编写源代码的机器可以和目标机器有完全不同的特性(操作系统与处理器架构)。

在接下来的内容中,我们将会讨论如何在 Linux、Mac OS X 和 Windows 上安装 Go 语言。

2. Mac系统

2.1 下载Go编译器

https://golang.google.cn/

2.2 点击安装
image-20200530225723360

默认的安装目录:/usr/local/go/

编译器启动文件:/usr/local/go/bin/go

2.3 配置环境PATH
export PATH=/usr/local/go/bin:$PATH
2.4 其他配置
2.4.1 创建一个任意目录

此目录以后放你写的所有go代码。

/Users/xxx/GolangProjects/
- bin,通过go install编译时候,生成的可执行文件。
- pkg,通过go install编译时候,生成的包文件。
- src,放我们以后编写的所有go代码和依赖。
2.4.2 配置环境变量
// Go安装目录
export GOROOT=/usr/local/go
// 代码和编译之后的文件相关代码
export GOPATH=/Users/xxx/GolangProjects
// 存放编译之后的文件
export GOBIN=/Users/xxx/GolangProjects/bin
2.5 环境变量持久化

vim ~/.bash_profile

export PATH=/usr/local/go/bin:$PATH
export GOROOT=/usr/local/go
export GOPATH=/Users/xxx/GolangProjects
export GOBIN=/Users/xxx/GolangProjects/bin
2.6 编写go代码
$GOPATH
├── bin
├── pkg
└── src
    └── crm
        └── app.go
package main

import "fmt"

func main() {
    fmt.Println("我的第一个Golang程序,好开心!")
}
2.7 运行

本质上就是让Go编译器去运行咱们编写的代码。

方式1:

// 先进入项目目录
go run app.go

方式2(推荐):

// 先进入项目目录

// 编译代码
go build
// 运行
./crm

方式3:

// 先进入项目目录
go install 

// 去bin运行
./crm
$GOPATH
├── bin
│   └── crm
├── pkg
└── src
    └── crm
        └── app.go

3. Linux系统

3.1 下载Go编译器

https://golang.google.cn/

3.2 安装
安装目录
/opt/go

启动Go编译器文件:/opt/go/bin/go

3.3 配置环境变量PATH
export PATH=/opt/go/bin:$PATH
3.4 其他配置
3.4.1 创建一个任意目录

存放咱们编写的所有项目代码,编译文件之后存放编译后的文件。

/home/xxx/GolangProjects/
- bin,在执行go install 命令,生成的可执行文件的目录。
- pkg,在执行go install 命令,存放生成的包文件。
- src,以后编写的所有Go代码都会放在这个目录。
    - crm
        - app.go
    - luffy
        - lk.go
3.4.2 环境变量的配置
export GOROOT=/opt/go
export GOPATH=/home/xxx/GolangProjects
export GOBIN=/home/xxx/GolangProjects/bin
3.5 环境变量的持久化

vim ~/.bash_profile

export PATH=/opt/go/bin:$PATH
export GOROOT=/opt/go
export GOPATH=/home/xxx/GolangProjects
export GOBIN=/home/xxx/GolangProjects/bin
3.6 编写go代码
/home/xxx/GolangProjects(简写$GOPATH)
├── bin
├── pkg
└── src
    └── crm
        └── app.go
package main
import "fmt"
func main() {
    // 调用Println函数在屏幕输出:这是我的第一个Golang程序,好开心
    fmt.Println("我的第一个Golang程序,好开心!")
}
3.7 运行代码

本质上将写好的代码交给Go编译器去执行。

方式1:

// 进入项目目录
go run app.go

方式2(推荐):

// 进入项目目录

// 编译代码并生成一个可执行文件
go build  

// 运行
./crm

方式3:

// 进入项目目录

// 编译代码,把编译之后的结果会放在 bin/pkg目录
go install 

// 运行
./crm
├── bin
│   └── crm
├── pkg
└── src
    └── crm
        └── app.go

Go程序员的项目:

  • 产出一个可执行文件。
  • 产出一个包文件。

4. Windows系统

4.1 下载Go编译器

https://golang.google.cn/

4.2 点击安装
4.3 环境变量PATH

以便于以后运行GO编译器时,无需再写路径。

image-20201127155836724

4.4 其他配置
4.4.1 创建一个任意目录

以后咱们的go项目都要按照要求放在这个目录。

Y:\GolangProjects
 - bin,go install在编译项目时,生成的可执行文件会放到此目录。
 - pkg,go install在编译项目时,生成的包文件会放到此目录。
 - src,以后所有的项目都要放在这个目录。
     - xxx
         - yy.go
4.4.2 环境变量配置

image-20200531115559729

4.5 编写代码
Y:\GolangProjects
 - bin
 - pkg
 - src,以后所有的项目都要放在这个目录。
     - crm
         - app.go
package main

import "fmt"

func main() {
    fmt.Println("这是我的第一个Golang程序,好开心")
}
4.6 运行

本质上就是把Go代码交给Go编译器去执行。

方式1:

// 进入项目目录
go run app.go

方式2(推荐):

// 进入项目目录
go build

crm.exe

方式3:

// 进入项目目录
go install

执行 crm.exe
Y:\GolangProjects
 - bin
     - crm.exe
 - pkg
     - windows_amd64
         - utils.a
 - src,以后所有的项目都要放在这个目录。
     - crm
         - app.go
     - utils
         - page.go

平时开发:

  • 开发可执行文件,用来让用户使用。
  • 开发一个包文件,其他项目来进行调用。

5. 总结

首先要去下载Go编译器,然后进行安装,在安装目录下就是GO编译器相关的所有内容。

mac:     /etc/local/go/
linux:   /opt/go/
windows: C:\go\  可以自定义

在安装目录下有 bin目录中有一个go可执行文件,基于他来启动编译器。

  • 直接通过路径找到可执行文件去运行(麻烦)
  • /etc/local/go/bin 目录添加PATH环境变量中。

那么在终端就可以执行执行go version,调用咱们安装的编译器。

如果想要正确的使用go编译器,还需做一些相关的配置(其他语言)。

  • 创建目录,用于存放项目代码、编译后的可执行文件、编译后的包文件。

    xxxx
    - bin
    - pkg
    - src
        - crm
            app.go

编写代码,然后进行。

写了两个项目:

  • crm,编译后生成一个可执行文件。
  • utils,编译后生成一个包文件。

运行项目

  • go run,运行项目代码,内部会先编译并将编译后的文件放在系统的临时目录,然后再自动执行。
  • go build,运行项目代码,手动编译并生成一个可执行文件,然后再自动执行。
  • go install ,生成可执行文件 + 包文件,并且会将编译后的文件放在bin/pkg目录。

5. 开发工具

  • Goland,IDE(继承开发环境)【收费】
  • vscode,编辑器 + 第三发组件 【免费】
5. 1 下载Goland

https://www.jetbrains.com/go/

image-20201127153001017

5.2 配置
  • 字体

    image-20201127155356732

  • 参数提示

    image-20201127155237379

  • GOPROXY

    image-20201127170300069

6. Goland激活

三、hello word

按照惯例,介绍所有编程语言的第一个程序都是“Hello, World!”。我们还是不想打破这个惯例(因为这个传统正是从Go语言的前辈C语言传承而来的)。下面的代码展示的Go语言程序输出的是中文“你好, 世界!”。

package main

import "fmt"

func main() {
    fmt.Println("你好, 世界!")
}

将以上代码保存到hello.go文件中。因为代码中有非ASCII的中文字符,我们需要将文件的编码显式指定为无BOM的UTF8编码格式(源文件采用UTF8编码是Go语言规范所要求的)。然后进入命令行并切换到hello.go文件所在的目录。目前我们可以将Go语言当作脚本语言,在命令行中直接输入go run hello.go来运行程序。如果一切正常的话。应该可以在命令行看到输出”你好, 世界!”的结果。

现在,让我们简单介绍一下程序。所有的Go程序,都是由最基本的函数和变量构成,函数和变量被组织到一个个单独的Go源文件中,这些源文件再按照作者的意图组织成合适的package,最终这些package再有机地组成一个完整的Go语言程序。其中,函数用于包含一系列的语句(指明要执行的操作序列),以及执行操作时存放数据的变量。我们这个程序中函数的名字是main。虽然Go语言中,函数的名字没有太多的限制,但是main包中的main函数默认是每一个可执行程序的入口。而package则用于包装和组织相关的函数、变量和常量。在使用一个package之前,我们需要使用import语句导入包。例如,我们这个程序中导入了fmt包(fmt是format单词的缩写,表示格式化相关的包),然后我们才可以使用fmt包中的Println函数。

而双引号包含的“你好, 世界!”则是Go语言的字符串面值常量。和C语言中的字符串不同,Go语言中的字符串内容是不可变更的。在以字符串作为参数传递给fmt.Println函数时,字符串的内容并没有被复制——传递的仅仅是字符串的地址和长度(字符串的结构在reflect.StringHeader中定义)。在Go语言中,函数参数都是以复制的方式(不支持以引用的方式)传递(比较特殊的是,Go语言闭包函数对外部变量是以引用的方式使用)。

四、命令

如果你已安装了golang环境,你可以在命令行执行go命令查看相关的Go语言命令:

$ go
Go is a tool for managing Go source code.

Usage:

        go <command> [arguments]

The commands are:

        bug         start a bug report
        build       compile packages and dependencies
        clean       remove object files and cached files
        doc         show documentation for package or symbol
        env         print Go environment information
        fix         update packages to use new APIs
        fmt         gofmt (reformat) package sources
        generate    generate Go files by processing source
        get         add dependencies to current module and install them
        install     compile and install packages and dependencies
        list        list packages or modules
        mod         module maintenance
        run         compile and run Go program
        test        test packages
        tool        run specified go tool
        version     print Go version
        vet         report likely mistakes in packages

Use "go help <command>" for more information about a command.

Additional help topics:

        buildconstraint build constraints
        buildmode       build modes
        c               calling between Go and C
        cache           build and test caching
        environment     environment variables
        filetype        file types
        go.mod          the go.mod file
        gopath          GOPATH environment variable
        gopath-get      legacy GOPATH go get
        goproxy         module proxy protocol
        importpath      import path syntax
        modules         modules, module versions, and more
        module-get      module-aware go get
        module-auth     module authentication using go.sum
        module-private  module configuration for non-public modules
        packages        package lists and patterns
        testflag        testing flags
        testfunc        testing functions

Use "go help <topic>" for more information about that topic.
  • go env用于打印Go语言的环境信息。
  • go run命令可以编译并运行命令源码文件。
  • go get可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。
  • go build命令用于编译我们指定的源码文件或代码包以及它们的依赖包。
  • go install用于编译并安装指定的代码包及它们的依赖包。
  • go clean命令会删除掉执行其它命令时产生的一些文件和目录。
  • go doc命令可以打印附于Go语言程序实体上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到查看其文档的目的。
  • go test命令用于对Go语言编写的程序进行测试。
  • go list命令的作用是列出指定的代码包的信息。
  • go mod命令的作用是列出操作modules相关指令(最新的包管理工具,后续会介绍)。
  • go fix会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。
  • go vet是一个用于检查Go语言源码中静态错误的简单工具。
  • go tool pprof命令来交互式的访问概要文件的内容。

文章作者: 张亚飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 张亚飞 !
评论
 上一篇
第2篇:Go快速上手 第2篇:Go快速上手
内容概要 初识包管理,知道项目中文件和文件、文件和文件夹之间关系。 输出,写代码,在go编译器运行时会在屏幕显示内容。 初识数据类型 整型,数字。例如:1、2、3、4 字符串,表示文本信息。例如:“如家” “锦江之星” 布尔类型,真假。
2020-12-26
下一篇 
番外篇:控制台打印表格和颜色 番外篇:控制台打印表格和颜色
打印表格Python内置的print函数和字符串格式化可以帮我们实现大部分打印功能,但有时我们想在控制台打印一些类似表格型的数据往往会比较困难,尤其是中文问混合对齐的问题,那是相当头疼。本节给大家介绍一个第三方表格美化模块prettytab
2020-12-25
  目录