基础入门第一个Go语言程序!

Go语言优势

语法简洁,相比其他语言更容易上手,开发效率更高。

自带垃圾回收(GC),不用再手动申请释放内存,能够有效避免 Bug,提高性能。

语言层面的并发支持,让你很容易开发出高性能的程序。

提供的标准库强大,第三方库也足够丰富,可以拿来即用,提高开发效率。

可通过静态编译直接生成一个可执行文件,运行时不依赖其他库,部署方便,可伸缩能力强。

提供跨平台支持,很容易编译出跨各个系统平台直接运行的程序。

Java 虽然具备垃圾回收功能,但它是解释型语言:

需要安装 JVM 虚拟机才能运行。

C 语言虽然不用解释,可以直接编译运行,但是它不具备垃圾回收功能。

  • 需要开发者自己管理内存的申请和释放,容易出问题。

Go 语言具备了两者的优势。

微服务和云原生已经成为一种趋势,而 Go 作为一款高性能的编译型语言。

最适合承载落地微服务的实现。

又容易生成跨平台的可执行文件,相比其他编程语言更容易部署在 Docker 容器中,实现灵活的自动伸缩服务。

第一个Go语言程序

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("Hello, 世界")
}
1
2
3
$ go run ch01/main.go

Hello, 世界

代码中的 go 是一个 Go 语言开发工具包提供的命令

  • 它和平时常用的 ls 命令一样都是可执行的命令

  • 它可以帮助运行 Go 语言代码,并进行编译,生成可执行的二进制文件等

run 在这里是 go 命令的子命令,表示要运行 Go 语言代码的意思

第一行的 package main

代表当前的 ch01/main.go 文件属于哪个包

  • 其中 package 是 Go 语言声明包的关键字,main 是要声明的包名

在 Go 语言中 main 包是一个特殊的包

  • 代表你的 Go 语言项目是一个可运行的应用程序,而不是一个被其他项目引用的库

第二行的 import fmt

是导入一个 fmt 包,其中 import 是 Go 语言的关键字,表示导入包的意思

  • 这里导入的是 fmt 包,导入的目的是要使用它

第三行的 func main()

是定义了一个函数,其中 func 是 Go 语言的关键字,表示要定义一个函数或者方法的意思

  • main 是函数名,() 空括号表示这个 main 函数不接受任何参数

在 Go 语言中 main 函数是一个特殊的函数,它代表整个程序的入口

  • 也就是程序在运行的时候,会先调用 main 函数

然后通过 main 函数再调用其他函数,达到实现项目业务需求的目的

第四行的 fmt.Println(“Hello, 世界”)

是通过 fmt 包的 Println 函数打印 Hello, 世界 这段文本

  • 其中 fmt 是刚刚导入的包,要想使用一个包,必须先导入

Println 函数是属于包 fmt 的函数,这里我需要它打印输出一段文本,也就是 Hello, 世界

第五行的大括号 }

表示 main 函数体的结束。

语言环境搭建

先下载 Go 语言开发包

可以从官网 https://golang.org/dl/https://golang.google.cn/dl/ 下载

  • 第一个链接是国外的官网,第二个是国内的官网,如果第一个访问不了,可以从第二个下载

安装测试

可以打开终端或者命令提示符,输入 go version 来验证 Go 语言开发工具包是否安装成功

  • 如果成功的话,会打印出 Go 语言的版本和系统信息

环境变量设置

GOPATH

  • 代表 Go 语言项目的工作目录,在 Go Module 模式之前非常重要
    • 现在基本上用来存放使用 go get 命令获取的项目

GOBIN

  • 代表 Go 编译生成的程序的安装目录
    • 比如通过 go install 命令
      • 会把生成的 Go 程序安装到 GOBIN 目录下,以供你在终端使用

假设工作目录为 /Users/flysnow/go

你需要把 GOPATH 环境变量设置为 /Users/flysnow/go

  • 把 GOBIN 环境变量设置为 $GOPATH/bin

项目结构

采用 Go Module 的方式,可以在任何位置创建你的 Go 语言项目。

假设你的项目位置是 /Users/flysnow/git/gotour

打开终端,输入如下命令切换到该目录下:

1
$ cd /Users/flysnow/git/gotour

然后再执行如下命令创建一个 Go Module 项目:

1
$ go mod init

执行成功后,会生成一个 go.mod 文件。

然后在当前目录下创建一个 main.go 文件,这样整个项目目录结构是:

1
2
3
4
5
gotour

├── go.mod
├── lib
└── main.go

其中 main.go 是整个项目的入口文件,里面有 main 函数。

lib 目录是项目的子模块,根据项目需求可以新建很多个目录作为子模块

  • 也可以继续嵌套为子模块的子模块。

编译发布

可以编译生成可执行文件

  • 也可以把它发布到 $GOBIN 目录,以供在终端使用。

在项目根目录输入以下命令,即可编译一个可执行文件。

1
$ go build ./ch01/main.go

回车执行后会在当前目录生成 main 可执行文件。

1
2
3
$ ./main 

Hello, 世界

如果成功打印出 Hello, 世界,证明程序成功生成。

以上生成的可执行文件在当前目录

  • 也可以把它安装到 $GOBIN 目录或者任意位置,如下所示:
1
$ go install ./ch01/main.go

使用 go install 命令即可,现在你在任意时刻打开终端

  • 输入 main 回车,都会打印出 Hello, 世界

跨平台编译

Go 语言通过两个环境变量来控制跨平台编译,它们分别是 GOOSGOARCH

  • GOOS:代表要编译的目标操作系统

    • 常见的有 Linux、Windows、Darwin 等。
  • GOARCH:代表要编译的目标处理器架构

    • 常见的有 386、AMD64、ARM64 等。

这样通过组合不同的 GOOS 和 GOARCH

  • 就可以编译出不同的可执行程序。

比如操作系统是 macOS AMD64 的,想编译出 Linux AMD64 的可执行程序

  • 只需要执行 go build 命令即可,如以下代码所示:
1
$ GOOS=linux GOARCH=amd64 go build ./ch01/main.go

编辑器推荐

第一款是 Visual Studio Code + Go 扩展插件

第二款是老牌 IDE 公司 JetBrains 推出的 Goland,所有插件已经全部集成