Initial commit
This commit is contained in:
@@ -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 字符(根据整数值打印对应的字符) |
|
||||
Reference in New Issue
Block a user