Files
notes/resource/go/待总结/001 Go 语言环境准备.md
T
2026-03-01 01:43:46 +08:00

249 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 环境准备
## 下载安装
下载地址: 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 字符(根据整数值打印对应的字符) |