下载对应版本的 go 版本
https://go.dev/dl/
配置 vim ~/.zshrc
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
source ~/.zshrc
>>>>>> go version
goland 配置:
🔍 一、什么是GOPATH?
GOPATH 是旧的项目结构管理方式(Go Modules 出现前),它要求所有代码必须放在 $GOPATH/src 目录下,并通过 go get 下载依赖。
- 默认 GOPATH 是 ~/go。
- 所有第三方依赖都放在 ~/go/pkg,所有项目放在 ~/go/src。
- 缺点:代码必须放在固定位置,很不灵活。
✅ 二、什么是Go Modules?(Go 1.11+ 推荐使用)
Go Modules 是 Go 推荐的依赖管理方式,从 Go 1.16 开始默认启用。
优点包括:
- 不需要依赖 GOPATH。
- 支持多项目、多模块开发。
- 每个项目可以独立管理依赖(go.mod 就像 Python 的 requirements.txt)。有 go.mod 就是表示 go modules 了
➜ go_study git:(main) ✗ go mod init go_study
go: creating new go.mod: module go_study
go: to add module requirements and sums:go mod tidy>>>>>go mod init gin-api-template (初始化项目)
含义:
- 创建了当前项目的模块管理文件 go.mod。
- go_study 是你的模块名(可以是本地名,也可以是 Git 地址)。
- 这相当于 npm init 或 pip init。
简单的gin 使用
安装依赖
go mod tidy>>>>>go get github.com/gin-gonic/gin
命令 | 作用 | 说明 |
---|---|---|
go get github.com/gin-gonic/gin | 显式添加某个依赖 | 会将 gin 添加到 go.mod 的 require 中,并下载到 go.sum |
go mod tidy | 整理依赖(推荐常用) | 自动添加“用到了但未声明”的依赖,删除“声明了但没用”的依赖 |
你没有写import:
- ❌ 执行 go mod tidy:什么都不干(因为没用到)。
- ✅ 执行 go get:它会强行添加这个依赖(即使没用到)。
main.go
package mainimport ("fmt""go_study/gin_test"
)func main() {fmt.Println("Hello, Go Modules!")gin_test.GinHttp()
}
gin_test/gin_testa.go
package gin_testimport "github.com/gin-gonic/gin"func GinHttp() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message": "pong",})})r.Run(":8080")
}
运行 main.go 就可以看到了。
Go 导包与函数调用行为
1.多个文件的组织方式
在 Go 中,同一个目录下的多个 .go 文件,只要 package 名一样(如 package gin_test)就会视为同一个包,这些文件的内容会被编译器自动合并成一个整体。
也就是说:
// gin_testa.go
package gin_testfunc GinHttp() {// 实现 A
}// gin_testb.go
package gin_testfunc GinHttp() {// 实现 B
}
👆这种写法是不允许的,编译时会报错:GinHttp redeclared in this block,因为你定义了两个同名函数在同一个包里,Go 是静态强类型语言,不允许重复定义同名标识符。
✅ 和 Python 的对比(重要)
对比项 | Go | Python |
---|---|---|
包管理 | 编译期检查,结构严格 | 动态加载,结构灵活 |
导入行为 | 显式导入包名后调用函数 | 可以直接导入函数/类 |
文件作用域 | 同一包下自动合并多个 .go 文件 | 每个 .py 文件都是独立模块 |
- Go 不像 Python 动态导入模块那样“运行到才执行”,而是编译前统一构建;
- 同一个 package 下的多个文件函数名不能重复;
- 如果你希望有两个同名函数,请把它们放在不同 package下;
- 合理使用模块和包组织,是 Go 项目整洁的关键。
Go 是一个 面向组合而不是面向继承 的语言。它没有传统 OOP 的 class 关键字,但你完全可以通过 struct + method(方法) 实现“类”的大多数功能。
特性 | Go 中的实现 |
---|---|
类 | 用 struct 替代 |
方法 | func (r *Receiver) Method() |
构造函数 | 自己写一个返回 struct 的函数 |
继承 | 不支持,使用组合代替 |
接口 | 内嵌接口 + duck typing(非常强) |
多态 | 接口实现自动判定 |
配置热重载
air 是 Go 社区最流行的热重载工具,类似于 Python 中的 uvicorn --reload。
go install github.com/air-verse/air@latest
⚠️ 安装后需将 $GOPATH/bin 添加到你的 PATH:
# 确保 GOPATH/bin 加入 PATH
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.zshrc
source ~/.zshrc# 验证 air 安装成功
which air
air -v
第一步:在项目根目录运行一次(生成配置文件):
air init
这会在当前目录生成一个 .air.toml 配置文件。
第二步:运行热更新服务
在项目根目录执行:
air
这会自动监控你的 Go 文件,一旦你修改代码,它会自动重启服务(像 FastAPI 的 uvicorn --reload 一样)。