Go语言基础入门

前言

Go是由谷歌支持的开源编程语言,属于编译型语言,对并发编程有较好的支持。

官网页面:https://go.dev/ 或者 https://golang.google.cn/

在这里插入图片描述

主要适合应用于下面场合:

  • Cloud & Network Services
  • Command-line Interfaces
  • Web Development
  • DevOps & Site Reliability

当然也不仅限于上面场合了,至少我用在特定情况下的嵌入式开发也是很不错的,可以在性能需求和开发速度上找到一个不错的平衡点。

这篇文章将介绍Go语言基础入门相关内容。

本文中Go版本为 1.19

安装

Windows
Windows下没什么好说的,从官网下载安装包安装即可。安装完成后可以在命令提示符中使用 go version 查看到版本信息。

Linux
这里使用 Ubuntu Desktop 20.04.4 为基础进行介绍。

事实上 Ubuntu 中可以直接使用 apt install golang 来安装的,不过默认情况下这样安装得到的版本会比较低,所以这里使用更加通用的方式来进行安装。

从官网下载合适的包:
在这里插入图片描述

下载完成后进行解压,然后配置下环境变量就可以使用了:

# cd ~
# 下载
wget https://go.dev/dl/go1.19.1.linux-amd64.tar.gz
# 解压,会得到go目录
tar xzf go1.19.1.linux-amd64.tar.gz 
# rm go1.19.1.linux-amd64.tar.gz

# 导出到环境变量,注意使用自己的地址
# 下面方式属于临时设置,每次打开都需要重新设置
export PATH=$PATH:/home/nx/go/bin
# 下面方式重启后用户登陆时会自动设置(也可以使用source ~/.profile使其立即生效)
# echo 'export PATH=$PATH:/home/nx/go/bin' >> ~/.profile

# 设置了环境变量后可以使用下面方式查看
# go version

代理设置

和Python的pip、Nodejs的npm等一样,Go现在也有方便的第三方模块下载方式。在Go里面这叫做mod(module),某些方面上这个比pip和npm使用起来更加方便。但是在大陆的网络环境下通常不好用,所以需要设置代理。常见的代理如下:
https://goproxy.cn/(七牛云)
https://goproxy.io/zh/

设置代理主要的操作就是修改go的环境变量。这里使用七牛云提供的代理进行说明:

Windows
在命令提示符中进行设置:

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn
# 设置完成后可以使用 go env 查看

在这里插入图片描述

Linux
在终端中进行设置:

# Linux下可以使用下面方式设置为go的全局环境变量
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn
# 或者也可以使用下面方式来临时设置
export GO111MODULE=on
export GOPROXY=https://goproxy.cn

在这里插入图片描述

开发环境

Go开发环境常见的有下面一些:
Visual Studio Code:https://code.visualstudio.com/
GoLand:https://www.jetbrains.com/go/
LiteIDE:http://liteide.org/cn/

这里使用Visual Studio Code(VS Code)进行介绍:

Windows 下直接去官网下载安装包进行安装即可。(安装时可以勾选将VS Code添加到系统上下文菜单)

Ubuntu 中使用下面命令进行安装:

sudo snap install code --classic

安装完成后在VS Code安装Go扩展:
在这里插入图片描述

然后随便新建一个名为 *.go 的文件(比如 test.go),使用VS Code打开,这时应该会提示安装一些开发调试用的工具:
在这里插入图片描述
选择全部安装即可(注意网络问题,最好设置好代理再进行):
在这里插入图片描述

程序编写与编译

  • 新建 hello 文件夹,使用VS Code打开;
  • 在终端中输入 go mod init hello 来初始化模块(这个下文会具体介绍);
  • hello 文件夹中新建 hello.go 文件,写入下面内容:
    package main
    
    import "fmt" // 引用语言内置包
    
    // main函数是主程序的入口
    func main() {
    	fmt.Println("Hello, World!") // 向控制台输出消息
    }
    
  • 在终端中输入 go build 就可以编译生成可执行文件了(hello.exe);
  • 可以运行可执行文件,可以看到终端中输出了相应的内容;

在这里插入图片描述

  • go build 可以指定特定的文件进行编译,比如 go build hello.go
  • go build 可以指定生成的可执行文件的名称,比如 go build -o naisu.exe
  • go build 可以指定生成的可执行文件的路径,比如 go build -o bin/ 就会将编译生成的可执行文件输出到当前目录下的 bin/ 目录中(如果不存在则自动建立);
  • 上面两条可以结合起来使用,比如 go build -o bin/naisu.exe
  • 除了 go build ,也可以使用 go run . (当前目录)或者 go run hello.go (指定文件)不生成可以执行文件直接运行程序;

到目前为止已经可以使用Go来编写自己的应用程序了,对于Go语法相关基础内容可以参考官方下面教程:
https://go.dev/tour/list
对于语法相关基础内容官方也提供了中文教程:
https://tour.go-zh.org/list

调试程序

可以直接按 F5 进行调试(需要插件支持,没有安装的话会提示安装)。调试前先在需要停止的地方打上断点。

包和模块

Go中对于代码的组织管理主要基于包和模块的概念,通常一个项目可以视为一个模块,而一个模块是由一个或多个包构成的。

包(package)

  • 同一个文件夹中(不包含子目录)的所有 *.go 源码是一个包;
  • 每个 *.go 文件头部使用 package <name> 来声明包名,同一个包中源码的包名必须相同;
  • 声明为 package main 的包可以被编译为可执行文件;
  • main 包中有唯一一个 func main() {...} 函数,这是程序的入口;
  • 同个一包中不同文件中内容可以直接相互调用(相当于编译阶段这些文件是一整个,和Arduino差不多);

在这里插入图片描述

  • 上面提到了 main 函数,Go中还有 init 函数,一个程序中可以有多个;
  • init 函数会在 main 前运行,用来初始化一些操作;
  • 另外全局变量初始化会比 init 函数更加早;
  • 对于不同文件中的全局变量和 init 函数,依据该包中文件名称排列顺序进行初始化;

在这里插入图片描述

  • 文件夹中可以存在子目录,其中的 *.go 源码就属于另外的包了;
  • 子包也可以看作是当前项目模块下的子模块,所以导入时通过模块加路径形式导入,使用时通过包名使用;
  • 一个包中的变量和函数等只有首字母是大写的才能被其它包引用(相当于首字大写的是public,首字母小写或下划线的是private);
  • 另外提一句,如果按照本文的开发环境配置,最好先写功能代码,再处理import。因为工具会自动处理一些工作,比如没有使用的包就自动从import中删除;同样的用到了的能找到的话它也会自动加上;

在这里插入图片描述

  • 不同包之间 init 等执行顺序依据最末端最少依赖的最先被调用(包初始化顺序受GO版本影响,在 1.21.0 版本中明确了包初始化顺序算法);

在这里插入图片描述

  • 子包目录名称为 internal 的话,那它内部的内容只能被其直接相邻的父包和该父包中的其它子包调用;

模块(module)

目前Go的所有项目或者库对外来说够可以看作是一个模块。

在前面内容中有使用 go mod init hello 来初始化模块,这会生成一个 go.mod 文件,其中 init 后面的内容是 模块路径 ,会记录在生成的文件中。默认情况下Go的各种模块都是放到其环境变量中 GOROOTGOPATH 目录中特定子目录下的。比如一般下载的第三方模块都会在 $GOPATH/pkg/mod/ 目录下,而这个目录下模块真实代码存放的位置就是前面 模块路径 对应的位置了。

在这里插入图片描述

模块路径理论上只要最后面一节就行,但是一为了防止和其它模块重名而冲突,二为了发布后别人方便下载,所以通常都会像上面那样。

Go的对外发布的第三方模块都可以在终端中使用 go get path 来下载,比如下载 github.com/gin-gonic/gin 模块可以使用下面方式:

# 下载到的模块会放在 `$GOPATH/pkg/mod/<模块路径>` 目录下
go get github.com/gin-gonic/gin
# 下方方式如果本地仓库中已有则会更新到最新版本
# go get -u github.com/gin-gonic/gin

使用时使用下面方式:

package main

import "github.com/gin-gonic/gin"

func main() {
	// r := gin.Default() // 模块名或者说包名为gin,可以从源码的package <name>那一行看到
	// ...
}

当然如果用到的第三方模块很多的话其实一个个下载也不方便,可以先写代码,代码中import相关的模块,然后在终端中使用 go mod tidy 来自动处理所有的第三方模块下载等相关事务,并更新 go.modgo.sum 文件。

可以使用 go mod vendor 命令将所有第三方模块拷贝一份备份到项目目录的 vendor 目录下(如果没有则会自动创建),之后该项目用到这些模块时关联的是此处的模块。

上面讲了第三方模块的情况,可以看到路径比较长,import时也是。但前面例程中也有短的,比如 fmt ,这个其实是 Go 语言的内置模块啦,除了这个还有很多其它的内置模块,这些内置模块的内容可以官网的下面地址进行了解:
https://pkg.go.dev/std

模块编写与使用

模块编写与使用参考如下:
https://go.dev/doc/tutorial/create-module

创建模块
创建模块和平常写代码一样,只不过可以不需要main包和main函数
在这里插入图片描述

其它程序中使用模块
其它模块中使用模块路径来使用,不过因为当前这个模块是未发布的本地模块,所以需要进行一些处理:

# 我这里演示中module这个模块和hello程序所属文件夹是在同一目录下的

# 下面命令将模块路径替换为文件系统下的真实路径(这里使用了相对路径,也可以使用绝对路径)
# 该命令会在go.mod中自动处理 replace ... 内容
go mod edit -replace github.com/NaisuXu/module=../module

# 下面命令用于处理相关依赖
# 该命令会在go.mod中自动处理 require... 内容
go mod tidy

在这里插入图片描述

完成上面操作后就可以测试了:
在这里插入图片描述

添加注释
模块各个接口上方添加注释可以在调用时直接看到(可能需要过会儿或是重启软件后才会显示):
在这里插入图片描述

处理错误
通常接口要对输入参数进行检查,如果不符合要求则返回相关错误,下面是个简单的演示:
在这里插入图片描述
在这里插入图片描述

测试模块
上面创建的模块并非main包,不具备main函数,没法直接运行,如果要测试的话得借助别的程序,不过Go中也带了用于这种情况下测试的方法。在模块目录中新建文件名为 _test.go 结尾的文件,该文件名的文件会被 go test 命令识别,会自动执行其中函数进行测试。 go test 为直接测试输出结果, go test -v 会输出详细测试过程:
在这里插入图片描述

发布模块
上面只是模块本地编写与使用基本的一些内容,如果需要发布模块可以参考下面内容:
https://go.dev/doc/modules/publishing
https://go.dev/doc/modules/developing

多模块工作区

上一章节中我们已经可以编写和使用本地模块了,但使用的方式会在 go.mod 文件中留下对路径 replace 的信息。这个替换后的路径不管是相对路径还是绝对路径都只是针对本机而言的,项目换台计算机就可能没法用了。使用多模块工作区(multi-module workspaces)可以一定程度上处理这个问题。

先准备两个模块:
在这里插入图片描述
在这里插入图片描述

将两个模块放到同一目录下,然后在该目录下使用 go work init 命令来初始化多模块工作区,这会生成一个 go.work 文件:
在这里插入图片描述

这之后可以在工作区目录下使用目录名或模块名来运行和编译项目:
在这里插入图片描述

工作区初始化之后可以使用 go work use xxx 继续添加模块。

总结

到这里为止介绍了Go语言基础入门相关的内容,有这些内容Go语言基本上已经可以用起来了,接下来只是学习相关语法、根据功能需求学习相关的内置模块和第三方模块,这些都可以通过实际项目练习掌握。

更多入门内容也可参考: 《The Way to Go》中文译本,中文正式名《Go 入门指南》
入门学习时可以配合简单项目进行练手:A golang ebook intro how to build a web with golang

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 很高兴为你推荐 Go 语言的中文基础入门教材。我推荐的是 "Go 入门指南" 这本书。这本书由阮一峰编写,是一本非常适合初学者学习 Go 的教材。它从 Go 语言的基本语法开始,一直讲到 Go 语言的高级特性,包括并发编程,网络编程,以及 Go 语言的工具链等。 另外,还有 "Go 编程基础" 这本书也是一本很好的 Go 语言入门教材。这本书由 AstaXie 编写,也是从 Go 语言的基本语法开始讲解,讲述的内容包括 Go 语言的数据类型、流程控制、函数、面向对象编程、并发编程等。 希望这些推荐能帮到你。 ### 回答2: 推荐《Go语言圣经》作为最新的中文基础入门教材,该书由美国Go语言的创始人之一Alan A.A. Donovan和Google工程师Brian W. Kernighan合著,由人民邮电出版社出版。该书以深入浅出的方式介绍了Go语言基础知识和核心概念,适合初学者入门使用。 《Go语言圣经》全书分为11个章节,从基础概念、基本语法和数据类型开始,逐步介绍了函数、指针、结构体、方法、接口、并发等高级特性。每个章节都配备了大量的示例代码和练习题,帮助读者理解和巩固所学知识。 这本书的亮点之一是它与Go语言官方文档相结合的方式,使得读者能够更好地理解和运用所学知识。此外,在讲解基础知识的同时,书中也涉及了一些实际应用场景,为读者提供了实践的机会。 《Go语言圣经》由于由Go语言的创始人之一和Google工程师合著,因此具有权威性和深度。该书的语言通俗易懂,适用于零基础或其他语言背景的读者。通过阅读和实践,读者能够掌握Go语言的基本语法和特性,为进一步的学习和应用打下基础。 ### 回答3: 在Go语言领域,有一本备受推荐和认可的中文基础入门教材是《Go语言入门指南》。这本教材由暮色短发撰写,是一本深受学习者欢迎的教程。 《Go语言入门指南》首先从介绍Go语言的历史和特点开始,帮助读者快速了解该语言的背景和优势。接着,教材详细讲解了Go语言的基本语法、数据类型、变量、函数、流程控制以及面向对象编程等核心概念。每个知识点都配有大量的代码实例和解释,让读者能够通过实践理解和巩固所学知识。 此外,《Go语言入门指南》还涵盖了常用的标准库和Go语言的并发编程,对如何使用这些特性进行了详细讲解。通过学习这些内容,读者可以掌握Go语言基础知识,并能够进行简单的项目开发。 这本教材的优点在于简洁明了,易于理解。作者结合自己的经验和实践,将复杂的概念和知识点讲解得浅显易懂。同时,配有丰富的实例和练习,帮助读者巩固所学内容。 总之,《Go语言入门指南》是我强烈推荐的Go语言基础教材。它适合初学者入门,也适合有一定编程基础的开发者进一步学习和提升。通过阅读这本教材,你可以有效地掌握Go语言基础知识,并能够运用到实际的项目开发中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值