Initial commit

This commit is contained in:
Docker7530
2026-03-01 01:43:46 +08:00
commit c6125c117b
3840 changed files with 415340 additions and 0 deletions
@@ -0,0 +1,248 @@
# 环境准备
## 下载安装
下载地址: 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 字符(根据整数值打印对应的字符) |