Setup Go
官网: https://go.dev/
- 下载: https://go.dev/dl/
- 安装之前配置环境变量:GOPATH, GOROOT
GOPATH
, GOROOT
?
GOPATH
:当使用go get
/go install
安装依赖时,会将源码安装在此,若使用go install
,下载完源码后会在本地编译,编译产生的二进制文件也会放在GOPATH
指定的目录下GOROOT
: Go 会将当前版本的工具链和 std 标准库安装在该变量指定的文件夹中
- 通过步骤
1
中下载的安装包安装 Go,如果是在 Windows 上,需要手动选择 Go 工具链的安装目录(似乎是没有读取 GOROOT) - 安装完成后,在终端输入
go version
,查看当前 Go 版本,若出现文件未找到等,关闭当前终端重新打开或者重启电脑再次尝试
GOPATH
, GOROOT
等环境变量参考配置
其中,
GOPROXY
为 Go 下载依赖的代理,在国内环境可以加速依赖的拉取GOTMPDIR
在使用 Go 编写程序时,可以使用go run
命令编译后直接运行当前程序,而该环境变量指向的地址就是go run
编译时产生的临时文件所放的地址, 如果不设置该变量,对于 Windows 来说,临时文件会放在 C 盘 Temp 文件夹中(其实不设置无伤大雅,Windows 自会在合适的时候清理这些缓存)
Go 代码组织
相对于 C/C++ 通过头文件和具体实现分离的设计,Go 在单个源码文件的基础上抽象出来一个 package
(包)的概念,一个 package
中可以包含多个
Go 语言源代码,通常是以 .go
结尾的文件,最佳实践,一个 package
对应一个文件夹,文件夹的名字就是 package
的名字
Go 的编程倡议里面有不少东西其实在某些场景下并不合适,具体项目具体分析
强烈推荐阅读: https://go.dev/doc/effective_go,取其精华即可,没必要无脑遵循
Hello, world!
新建文件夹,名称随意,推荐小写单词加连字符的组合(如 my-helloworld),终端进入该文件夹根目录,执行:
go mod init <module-name>
这里涉及到 Go 代码的另一个组织架构:“模块”(module, mod),其是一个或多个 package
组成的,除了远古项目外,现在均使用 Go Module 来组织代码,一般来说,一个项目对应一个 Go Module,
当然,也有在 Go Module 之上的组织架构 Go Workspace,可使用 go help work
查看使用方式,一个 Workspace 可包含多个 Go Module,这里不再展开叙述
注意到 go help
命令,Go 相关生态中,很少使用 --<xx>
等形式的参数传递,虽然支持,但力求节俭,后面涉及到 kubectl
等 k8s
相关指令时会体现的更加明显
这里 init
后面跟着的就是模块名,可以任取,推荐小写,用连字符-
连接,模块名称对于依赖拉取有着重要作用,这里不展开叙述
执行完命令后,会在当前文件夹下生成一个 go.mod
文件,该文件记录了当前模块的模块名以及依赖信息
Entry
对比 C/C++ 通过 main 函数作为程序入口,Go 通过 package main
和 func main()
来作为程序的入口,一个 Go 模块中只能有一个 main
包,且只能有一个 main
函数
main 函数只要在 package main 中即可,无关文件名称,需要注意的是,Go 用特定的文件名来指导编译和测试,具体自行百度
package main // 声明当前源码位于 main 包中,每个源码文件都需要该声明
import "fmt" // 导入依赖,类比于 #inclue <iostream>
func main() {
// 类比于 std::cout << "Hello, world!" << std::endl;
// 调用引入包中的函数或者成员,需要使用包名作为前缀,如果引入的包有重名,也可以给引入的包设置别名,这里不展开叙述
fmt.Println("Hello, world!")
}
/*
我是多行注释,但大大多数情况只是用单行注释 `//`
*/
命令行执行:
go run main.go # 或者 go run . (注意有个点)表示编译运行当前目录下的 main package
类比于 C/C++ 的 g++ main.cpp -o main
,你也可以用:
go build -o helloworld.exe main.go # 编译生成二进制文件,详情见 `go help build`
依赖拉取
建议阅读: https://go.dev/ref/mod
Go 有一个十分强大且精心编写的标准库 std,但这里展示一下如何拉取依赖:
go get github.com/gin-gonic/gin
你可能也会见过 go get -u xxxx
,具体差异自行百度
拉取后的依赖会放在 GOPATH
指定的相应目录中
之后修改你的 main 函数
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
执行 go run main.go
,打开浏览器访问 http://localhost:8080/ping
,即可看到 {"message":"pong"}
这里不展开具体的语法教学,网上的资料已经十分详细了,注意查看教程日期即可(访问量高的教程可能更新不及时或过期)
推荐工具
编辑器/IDE: VSCode,GoLand(收费,可使用学生认证等方式免费使用)
接口测试工具: Apifox
k8s
本地 k8s 学习环境搭建
kind: https://kind.sigs.k8s.io/
任选即可