# 环境准备 ## 下载安装 下载地址: https://go.dev 双击“下一步”安装,注意安装位置尽可能不放 C 盘,可以建立自己的环境目录。 安装完成后在 cmd 控制台输入 `go version` 查看 Go 版本,检测是否安装成功。 环境变量在新版本后不需要过多额外设置,但需注意用户变量中默认有 GOPATH 的设置,如果不希望放在默认用户目录下,需进行修改。 `GOPATH` 即为存储 Go 语言项目的路径,包含 src(已不强制要求)、pkg、bin 三个目录。 打开 cmd 控制台,输入 `go env` 查看 Go 的环境变量配置。 依次在 cmd 控制台设置代理和 `GO111MODULE`: ```shell go env -w GOPROXY=https://goproxy.cn,direct go env -w GO111MODULE=auto ``` ## 关于 GOPATH 在 Go 语言开发中,`GOPATH` 是一个环境变量,用于定义 Go 代码的工作区。传统的 Go 项目结构基于 `GOPATH` 下的三个经典目录,分别是: 1. src 存放 Go 源代码文件。按照惯例,源代码文件组织成以包为单位的目录,例如:`github.com/user/project`。 2. pkg 存放编译后的包文件(以 `.a` 结尾)。这些文件通常用于加速编译。 3. bin 存放编译生成的可执行文件。执行 `go install` 时,生成的二进制文件会放在 bin 目录中,方便直接运行。 ### 示例目录结构 ``` GOPATH ├── src // 源代码目录,存放你的 Go 项目代码 ├── bin // 可执行文件目录,存放编译后的可执行文件 └── pkg // 已编译的包目录 ├── linux_amd64 // 针对特定平台和架构编译的包文件 │ ├── foo.a // 编译后的 foo 包文件 │ └── bar.a // 编译后的 bar 包文件 └── mod // 在 Go Modules 模式下使用,存放模块缓存 ``` ### 为什么现在不再注重 GOPATH? 自从 Go 1.11 引入了 **Go Modules** 后,`GOPATH` 不再是项目管理的核心部分,以下是原因: 1. 模块化依赖管理 Go Modules 使用 `go.mod` 文件来管理依赖和版本,解决了 `GOPATH` 下多个项目共享依赖库时的冲突问题,避免了“依赖地狱”。 2. 无需固定目录 使用 Go Modules 后,项目可以放在任意目录下,而不再需要存放在 `GOPATH` 的 src 目录中,增加了开发的灵活性。 3. 版本控制 Go Modules 原生支持版本控制和依赖管理,确保项目中使用的是正确版本的依赖,而 `GOPATH` 无法提供这种能力。 4. 更简单的构建 通过 Go Modules,开发者可以直接运行 `go build` 或 `go run`,无需考虑是否在 `GOPATH` 内,提升了开发体验。 # 开发工具 采用 VsCode,如果写过 Java 可以使用 GoLand,会更顺手,一样的 UI。 1. 安装 VsCode 软件,在插件市场安装 GO 插件。 2. VsCode 软件的`settings.json` 文件中新增以下配置, 设置 `go tools` 的全局安装目录。 - `"go.toolsGopath": "D:\\MyGo\\go-tools"` 3. 安装扩展:快捷键 `ctrl+shift+p`,输入 `Go install`,选择 `Install/Update Tools`,勾选所有插件(插件显示可能会反应慢一些,稍等。)进行安装。 4. 等待安装完成。 # Hello World 创建文件:`hello.go` ```go package main import "fmt" func main() { fmt.Println("Hello World!") } ``` ## 1. package(声明包) 定义:Go 源文件必须以 `package` 开头,声明其所属的包。 1. 包名与文件夹一一对应,但可以不同。 2. 一个程序必须有且仅有一个 `main` 包,作为入口包。 3. 无 `main` 包的程序无法生成可执行文件。 ## 2. import(导入包) 格式: `import "包名"` 或用括号引入多个包: ```go import ( "name1" "name2" ) ``` > 注意: > 只能导入已使用的包,未使用的包会导致编译错误。 > `fmt` 是 Go 标准库,用于格式化输入输出。 ## 3. main 函数 Go 程序的入口函数,必须声明在 `main` 包中,且只能有一个。 其他包中不能定义 `main` 函数。 ```go func 函数名 (参数列表) (返回值列表) { 函数体 } ``` - 参数列表:`变量名 类型` 组合,如 `a int, b string`。 - 返回值列表:支持多个返回值,用 `return` 返回。 - 函数体左大括号 `{` 必须与函数声明在同一行。 ## 4. 打印 Hello World `Println` 为 `fmt` 包的函数,用于格式化输出,自动换行。 点号 `.` 表示调用 `fmt` 包的函数。 结尾无需分号 `;`,Go 编译器会自动处理。 # 编译和运行 Go 是编译型静态语言,在运行程序之前需将代码编译为二进制可执行文件。Go 提供两种主要命令用于编译和运行:`go build` 和 `go run`。 | 命令 | 功能 | 生成文件 | 适用场景 | | ---------- | ------------------ | ------------- | ----------- | | `go build` | 编译 Go 程序为可执行文件 | 生成 `.exe` 文件 | 用于生产环境或打包分发 | | `go run` | 编译后立即运行程序,不生成可执行文件 | 不生成文件,仅临时编译运行 | 用于调试、快速测试 | ## go build 命令 ```go go build fileName ``` `fileName`:Go 源文件名,可以是一个或多个,多个文件名用空格分隔;也可省略,省略时默认为当前目录。 参数不为空: - 如果 `fileName` 属于 `main` 包,生成与第一个 `fileName` 同名的可执行文件(如 `abc.go` 生成 `abc.exe`)。 - 如果 `fileName` 不属于 `main` 包,只进行语法检查,不生成可执行文件。 参数为空: - 如果当前目录包含 `main` 包,生成与目录同名的 `.exe` 文件(如 `hello` 目录下生成 `hello.exe`)。 - 如果目录中无 `main` 包,仅进行语法检查。 ```go go build .\hello.go ``` Windows 系统:当前目录使用 `.\` 表示。 类 Unix 系统:当前目录使用 `./` 表示。 # 常用 Print 方式 ## 1. Print 将内容**直接**输出到控制台。 不接受任何格式化,占位符无效。 等价于对每一个操作数应用 `%v`。 示例: ```go fmt.Print("Hello, World!") ``` 输出:`Hello, World!` ## 2. Println 输出内容后自动**换行**。 同样不支持格式化,占位符无效。 示例: ```go fmt.Println("Hello,", "World!") fmt.Println("Hello,", "World!") ``` 输出: ``` Hello, World! Hello, World! ``` ## 3. Printf 支持**格式化**输出,可按照指定的格式输出数据。 需要提供格式化占位符。 语法: ```go fmt.Printf(format, values...) ``` 示例: ```go var a, b, c = 1, 2, 3 fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c) ``` 输出: ``` a = 1, b = 2, c = 3 ``` > `\n` 为占位符。 ## 常见占位符 | 占位符 | 描述 | | ------------- | ------------------------------------- | | `%v` | 以默认格式打印变量的值(适用于大多数类型) | | `%T` | 打印变量的类型(类型名) | | `%s` | 输出字符串 | | `%t` | 输出布尔值(`true` 或 `false`) | | `%d` | 打印整数的十进制表示 | | `%b` | 打印整数的二进制表示 | | `%o` / `%#o` | 八进制,不带零 / 带零(0o,零加小写字母 o) | | `%x` / `%#x` | 小写十六进制 / 带 `0x` 前缀的小写十六进制 | | `%X` / `%#X` | 大写十六进制 / 带 `0X` 前缀的大写十六进制 | | `%f` / `%.3f` | 浮点数,默认精度 6 位小数 / 保留 3 位小数,位数可控 | | `%e` / `%.3e` | 科学计数法,默认精度 6 位小数 / 保留 3 位小数 | | `%U` / `%#U` | Unicode 字符 / 带字符的 Unicode,用 `rune` 声明 | | `%p` | 打印指针的地址,带 `0x` 前缀,变量前加 `&` 取指针 | | `%q` | 带双引号的字符串,字符串内的引号用转义符 | | `%c` | 打印一个 Unicode 字符(根据整数值打印对应的字符) |