Setup Go

官网: https://go.dev/

  1. 下载: https://go.dev/dl/
  2. 安装之前配置环境变量:GOPATH, GOROOT

GOPATH, GOROOT?

  • GOPATH:当使用 go get/go install 安装依赖时,会将源码安装在此,若使用 go install,下载完源码后会在本地编译,编译产生的二进制文件也会放在 GOPATH 指定的目录下
  • GOROOT: Go 会将当前版本的工具链和 std 标准库安装在该变量指定的文件夹中
  1. 通过步骤 1 中下载的安装包安装 Go,如果是在 Windows 上,需要手动选择 Go 工具链的安装目录(似乎是没有读取 GOROOT)
  2. 安装完成后,在终端输入 go version,查看当前 Go 版本,若出现文件未找到等,关闭当前终端重新打开或者重启电脑再次尝试

GOPATH, GOROOT 等环境变量参考配置

setup-go-env

其中,

  • 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> 等形式的参数传递,虽然支持,但力求节俭,后面涉及到 kubectlk8s 相关指令时会体现的更加明显

这里 init 后面跟着的就是模块名,可以任取,推荐小写,用连字符-连接,模块名称对于依赖拉取有着重要作用,这里不展开叙述

执行完命令后,会在当前文件夹下生成一个 go.mod 文件,该文件记录了当前模块的模块名以及依赖信息

Entry

对比 C/C++ 通过 main 函数作为程序入口,Go 通过 package mainfunc 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: VSCodeGoLand(收费,可使用学生认证等方式免费使用)

接口测试工具: Apifox

k8s

推荐阅读: https://kubernetes.io/zh-cn/docs/concepts/

本地 k8s 学习环境搭建

k3d: https://k3d.io/v5.6.3/

kind: https://kind.sigs.k8s.io/

任选即可